STM32F103C8T6使用普通IO口模拟串口收发

发布者:zhaodawei617最新更新时间:2019-09-11 来源: eefocus关键字:STM32F103C8T6  普通IO口  模拟串口  收发 手机看文章 扫描二维码
随时随地手机看文章

导:

由于项目系统功能版本升级,需要开发一个带有串口收发的功能,但是硬件串口已经全部使用,发现还剩余部分普通gpio口可以使用,故打算采用软件模拟的方法实现该功能;


很久以前使用过51单片机来实现过类似功能,现在首次使用stm32来实现该功能;先借鉴一些网上的demo;


产品的代码初始框架不是我自己搭建的,下回轮到我来搭,一定一定用操作系统来完成,要不然资源的配置,考虑太多,真的麻烦死了;


参考:https://blog.csdn.net/yunjie167/article/details/79808464


1.阻塞的通讯

阻塞式通讯

51单片机,是没有操作系统的,并且定时器也是非常的有限的;所以再模拟iic通讯,或者模拟SPI,或者模拟串口uart通讯的时候,通讯是需要delay来延时(delay函数)的位置;延时函数往往是让系统空闲下来等待做不其他事情,很浪费系统的时间资源(这种等待占用了系统时间做“无用之事”,具“阻塞”作用);比如下方这个:使用定时器来计时!


{这个算是稍微高级一点的延迟处理(比单纯的i--好),这个只要将其优先级别放到最低,既可实现不影响中断的处理!}


2 非阻塞式通讯-发送操作

就是我通讯需要的延时不占用系统空闲时间:她需要通讯时,正常通讯,当到达该延时的时刻时,把cpu交给其他任务执行(执行其他任务也需要耗费一些时间的),到继续通讯后,自己得到获取处理权限,继续执行。。。


这是很多操作系统可以完成最基本功能;


由于我的代码框架已经基本固定死了,现在在单片机用基本定时器来完成这样的事情。。。。即完成非阻塞式通讯!


(1)定时器开启如下:

(2)调用发送函数:

UART4_Send_Buf(...);//注意STM32F103C8t6是没有串口4的!!!这是虚拟串口!!

(3)调用的发送函数里面开启了定时器,所以接下来将在定时期中断中进行发送操作


发送函数模拟了串口的时序:开始-发送-结束


发送完一个字节,然后从缓冲区callback(),调用下一个字节进行传输!

代码段如下:


static void send_remain_byte(void)

{

if(VirtualUart.send_cnt>=VirtualUart.send_max)

{

VirtualUart.send_flag=0; //发送完毕

}

else

{

VirtualUart.TXREG=VirtualUart.sendbuff[VirtualUart.send_cnt++];

// Tx_Pin=0; //产生START信号

}

}

 

/**************************实现函数********************************************

*函数原型: void UART4_Send_Buf(unsigned char *buf,unsigned char len)

*功  能: 通过模拟出来的串口-UART4 发送几个字节 的数据

unsigned char *buf  存放数据的数组指针

unsigned char len   要发送的字节数

*******************************************************************************/

void UART4_Send_Buf(unsigned char *buf,unsigned char len)

{

unsigned char i ;

for(i=0;i {

VirtualUart.sendbuff[i]=*buf;

}

VirtualUart.send_cnt=0;//清除所得的数据大小

VirtualUart.send_max=len;//长度

VirtualUart.send_flag=1;//开始发生

VirtualUart.send_mode=1;//模式为非阻塞方式

TIM4->CR1|=0x01;    //使能定时器4

flag_firstBitGet=1;

}

//TIM4定时器里调用

static u8 tim_send_byte(void (*Callback)(void))

{

static int sendidx=0;

if(flag_firstBitGet)

{

flag_firstBitGet=0;

if(Callback!=NULL)   //还有数据-->有多个字节要发送,调用回调函数继续发送下一个字节

Callback();

else

VirtualUart.send_flag=0;//没数据了

}

if(sendidx==0)

{

sendidx++;

Tx_Pin=0; //产生START信号

}

else if(sendidx<=8) //DATA 1,2,3...8

{

sendidx++;

Tx_Pin=VirtualUart.TXREG&0x01;

VirtualUart.TXREG>>=1;

} else if(sendidx==9) 

{ //STOP

Tx_Pin=1;

sendidx++;

else if(sendidx==10) 

{ //STOP的发送完毕了

sendidx=0;

if(Callback!=NULL)   //还有数据-->有多个字节要发送,调用回调函数继续发送下一个字节

Callback();

else

VirtualUart.send_flag=0;//没数据了

return 0;//返回0-完整的一个字节传输完成

}

return 1; //返回1-正在传输字节过程中-busy

}

//定时器4中断服务程序

void TIM4_IRQHandler(void)   //TIM4中断

{

if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM4更新中断发生与否

{

tim4Counts++;

TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  //清除TIMx更新中断标志 

LED1=!LED1;

if(VirtualUart.send_mode) //发送模式:非阻塞

{

if(tim_send_byte(send_remain_byte)==0)//=0说明发送结束 

{

if(VirtualUart.send_flag==0)//发送处在结束状态

TIM4->CR1 &= ~TIM_CR1_CEN;//关闭定时器

TIM4->CNT=0; //清除定时器计数的数值

}

}

// else //

// {

// if(tim_send_byte(NULL)==0) 

// {

// TIM4->CR1 &= ~TIM_CR1_CEN;//关闭定时器

// TIM4->CNT=0; //清除定时器计数值

// }

// }

 

}

}


3 非阻塞式通讯-发送操作

这也不难作,来来回回就是有点绕


关键字:STM32F103C8T6  普通IO口  模拟串口  收发 引用地址:STM32F103C8T6使用普通IO口模拟串口收发

上一篇:STM32利用定时器1控制LED闪烁
下一篇:STM32 嵌入式学习入门(2)——STM32的GPIO介绍

推荐阅读最新更新时间:2024-11-09 11:59

浪涌保护不再难 适于ADM3055E/ADM3057E CAN FD收发器的5种方案请查收
引言 在工业、汽车和仪器仪表应用中,因操作不当、存在电气噪声的操作环境,甚至雷击造成的大瞬态电压可能会形成巨大压力,导致通信端口和基础电子设备受损。对此,ADI推出了信号和电源隔离式ADM3055E/ADM3057E CAN FD收发器,能够承受其中许多瞬态电压,并保护敏感的电子设备。 根据IEC标准和瞬态电压大小,瞬态电压可分为静电放电(ESD)、电快速瞬变脉冲群(EFT)和浪涌。通过ADM3055E/ADM3057E CAN FD收发器的片内集成保护,可实现4级IEC 61000-4-2 ESD保护、IEC 61000-4-4 EFT抗扰度和4级+跨栅IEC 61000-4-5浪涌保护。 当跨栅浪涌通过iCoupl
[电源管理]
浪涌保护不再难 适于ADM3055E/ADM3057E CAN FD<font color='red'>收发</font>器的5种方案请查收
基于STM32F103C8T6 MCU的STM32 Blue Pill Board接口
在本教程中,我将介绍如何将DHT11湿度和温度传感器与基于STM32F103C8T6 MCU的STM32 Blue Pill Board接口。DHT11传感器的值由STM32读取,并显示在I2C LCD显示屏上。 介绍 传感器是很小的设备,可以弥合原始模拟世界与MCU的数字世界之间的鸿沟。传感器可以非常简单,例如非常著名的LM35温度传感器,也可以是一些复杂的数学单元,例如MPU6050陀螺仪和加速度计组合传感器。 简单或复杂,传感器是许多消费,汽车,机器人和工业应用中的关键部分,如果不集成适当的传感器就无法完成某些应用。 让我们从工业应用程序扩展到日常项目和业余爱好者。气象站是一个非常普遍且受欢迎的项目,无论是物联网
[单片机]
教你们STM32如何收发float类型数据
实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: unionfloat_data { floatf_data; uint8_tby te ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: unionfloat_datarx_float_data,tx_float_data; 收发相关代码: 左右滑动查看全部代码 // if(HAL_ UART _Receive(&huart3,rx_float_data.byte
[单片机]
教你们STM32如何<font color='red'>收发</font>float类型数据
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved