历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2019年09月11日 | STM32F103C8T6使用普通IO口模拟串口收发

发布者:zhaodawei617 来源: 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介绍

推荐阅读

半导体是科技业的生存命脉,被喻为「21 世纪原油」。北京不想继续受制于人,砸钱发展,预料明年就会超越南韩,成为全球最大的半导体设备市场。南韩媒体BusinessKorea 报导,中国大撒银弹培植半导体,目标自制芯片比重从13% 升至70%,因此狂买半导体设备。外界估计中国半导体设备市场,2017 年市值为82 亿美元,2018 年将升至118 亿美元,2019 年续...
集微网9月10日消息(文/数码控),还有不到一天的时间iPhone11系列就要发布了,从不少的媒体报道中可以知道今年的iPhone11系列妥妥的没有支持5G网络,那不支持5G网络的iPhone11系列还有哪些优势呢?对上述问题,前魅族科技高级副总裁李楠在知乎上分享了自己的观点,李楠认为现在 5G 手机在没有 5G 信号覆盖的地方,唯一的优势是:更加费电。毕竟技术换...
  首都人民可以打无人驾驶出租车啦!  9月10日,百度Apollo宣布在北京正式开放自动驾驶出租车服务ApolloGo,北京用户可以在百度地图及Apollo官网上预约体验Robotaxi。  全国测试里程最长  百度方面向中国证券报记者表示,北京此次开放的自动驾驶载人测试区域总长度约700公里,覆盖亦庄、海淀、顺义的生活圈和商业圈等近百个站点,全国开放区域最广...
智东西(公众号:zhidxcom)作者 | 健恩编辑 | 云鹏智东西9月11日报道,昨天,世界机器人大会再次在北京亦庄拉开帷幕,智东西记者一大早便跨越整个北京城来到这里打探这场大会的最新消息。世界机器人大会自2015年开始举办,迄今为止已成功举办过5次。它不仅是国内一年一度规模最大的机器人产业顶级展会,也是国内机器人产业风向的集中展示。智东西了解...

史海拾趣

问答坊 | AI 解惑

电子工程师,别拿一分钱不当回事

一分钱,在现在物价飞涨的年代,早已经退出了货币交流的的历史舞台,成为财务意义上的最小计量单位。当年“我在马路边,捡到一分钱”的童谣,不会再发生了,一分钱,已经买不了任何东西。 一分钱,已经真的不值钱了吗?让我们来看年看电子物料的 ...…

查看全部问答∨

用Nokia 3310 液晶自制温度计

转自:窗户纸 http://www.getproject.com.cn/post/95.html 想像一下,如果有这么一个“裸体”温度计,就放在自己家里的书柜上,等朋友来了,一定会吸引不少眼光,你也可以借机炫耀一番。 不过放在家里的话,有可能曝光率不够高,那我们就随身携 ...…

查看全部问答∨

【ADC学习】ADC前端设计过程合集

设计步骤一:https://bbs.eeworld.com.cn/thread-96897-1-1.html 设计步骤二:https://bbs.eeworld.com.cn/thread-96899-1-1.html 设计步骤三:https://bbs.eeworld.com.cn/thread-96902-1-1.html 设计步骤四:https://bbs.eeworld.com.cn/thread-96 ...…

查看全部问答∨

CE6.0编译出错问题

我是将BSP包中的LCD显示部分文件全部拷到另一个目录下,然后在那个目录下的一个文件里面包含了个头文件(这个头文件在那个LCD显示文件中有定义的),也更改了source文件路径的,然后编译出现一大堆错误。sysgen了也不行的。请问是什么原因? …

查看全部问答∨

有需要JLINK的吗 ?

65元一个 http://item.taobao.com/item_detail.jhtml?item_id=76d334109aebd88799ad63cdbcce7d08&x_id=db2…

查看全部问答∨

VC#智能设备应用程序如何能使用vc2005开发的智能设备ocx? 高手指点

VC#智能设备应用程序如何能使用vc2005开发的智能设备ocx? 高手指点…

查看全部问答∨

EVC 中选择默认设备下拉菜单选项中只有Emulator没有Device

以前写的程序在PPC 2003中模拟,现在更换了设备,新设备系统是WinCE .net 5.0 ,编译时选择STANDARDSDK ,Win32(WCE ARMV4)Release可是Select default device选项中只有STANDARDSDK Emulator,没有device选择,新设备可以和PC机同步,我想编译后 ...…

查看全部问答∨

实现低功耗有哪些常用方法

我在做一个智能电子体温计,要求实现低功耗,系统电流小于0.3毫安。不能用贴片元件,我知道的方法就是所有三极管全用mos管,还有其他方法么?!…

查看全部问答∨

请教电感式接近传感器接口电路设计

请教大家一个问题:采用电感式接近传感器对铁磁金属靶标进行到位检测,传感器初始电感值是4.85mH,设置的接近门限电感值是5mH,要求接口电路输出的是离散电平信号,该如何设计?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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