历史上的今天
今天是:2024年09月11日(星期三)
2019年09月11日 | STM32F103C8T6使用普通IO口模拟串口收发
2019-09-11 来源:eefocus
导:
由于项目系统功能版本升级,需要开发一个带有串口收发的功能,但是硬件串口已经全部使用,发现还剩余部分普通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 非阻塞式通讯-发送操作 这也不难作,来来回回就是有点绕
史海拾趣
|
1、我们常用的PCB介质是FR4材料的,相对空气的介电常数是4.2-4.7。这个介电常数是会随温度变化的,在0-70度的温度范围内,其最大变化范围可以达到20%。介电常数的变化会导致线路延时10%的变化,温度越高,延时越大。介电常数还会随信号频率变化,频 ...… 查看全部问答> |
|
让家电智能人声化设计不再为难——WTV语音芯片帮你提升产品性能 本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 关键词:语音芯片,语音IC,WTV芯片,家电控制 语音芯片,采用数码电子技术将纯的无任何机械的半导体集成电路(IC)去完成语音信号的存储和还原,这样一类经过存储而还原播放的语言、声 ...… 查看全部问答> |
|
关于xilinx FPGA 中嵌入的PowerPC 405 cores 的使用问题请教 我手里的开发板是xilinx公司的v2pro芯片的xupv2p开发板。 芯片是嵌入了PowerPC405 cores ; 开发板上有一个DEBUG 16针接口。 我想问一下,如何使用这个接口呢?如何调试,仿真嵌入的PowerPC 呢? 如果需要下载程序到这个里面需要什么样的下载线 ...… 查看全部问答> |
|
任职条件: 大学嵌入式、计算机、电子专业本科学历。研究生、有工作经验者、有嵌入式相关证书者优先。 英语四级以上,六级以上者优先。 精通嵌入式C语言,熟练掌握嵌入式系统架构、原理。 热爱本职工作,具有较强的团队合作精神。 诚实、 ...… 查看全部问答> |
|
2410 文档 2410自带eCC功能: ECC generator block executes the followings: 1. When MCU writes data to NAND, the ECC generator block generates ECC code. 2. When MCU reads data from NAND, the ECC generator block generates ECC code ...… 查看全部问答> |
|
linux内核完全剖析 基于0.12内核 赵炯 的 200901的 txt doc pdf 的下载版本地址 谁有就给个链接吧 谢谢了哈 嘿嘿… 查看全部问答> |
|
本帖最后由 辛昕 于 2014-12-4 00:04 编辑 这算是前面 那个 Contiki系列的续编。不过,相对来说,我觉得它比较独立。 一直以来,用GCC编程是我的习惯,只不过,那也仅限于PC上的程序。而一 ...… 查看全部问答> |




