历史上的今天
返回首页

历史上的今天

今天是: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 非阻塞式通讯-发送操作

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


推荐阅读

史海拾趣

南京国博公司的发展小趣事

在5G浪潮的推动下,国博电子凭借其在射频集成电路领域的深厚技术积累,成功研制出5G毫米波段Massive MIMO毫米波有源相控阵组件等一系列典型产品。这些产品不仅在国内市场得到了广泛应用,还赢得了国际市场的认可。国博电子的技术领先不仅推动了国内5G通信产业的发展,也为全球5G通信技术的进步做出了重要贡献。

EDAL公司的发展小趣事

为了进一步巩固市场地位和提升技术实力,EDAL公司开始通过收购和合作的方式拓展业务。公司成功收购了几家在EDA领域具有领先地位的公司,获得了更多的技术专利和市场份额。此外,EDAL公司还与其他科技公司建立了战略合作关系,共同研发新技术、新产品,推动整个EDA行业的发展。

BRIGHT公司的发展小趣事

近年来,BRIGHT公司积极投身于太阳能领域的发展。他们推出了一种创新的商业模式,即帮助用户免费安装太阳能面板,并随后收取服务费。这一模式类似于有线电视的收费方式,有效降低了用户安装太阳能系统的门槛。通过与私人投资者的合作,BRIGHT公司成功承担了安装成本,并致力于向全球提供优质的屋顶太阳能解决方案。这一突破性的举措使得BRIGHT公司在太阳能领域取得了显著的成绩。

FTDI公司的发展小趣事

BRIGHT公司的历史可以追溯到1985年,由一群热爱音乐的年轻人和电子工程师共同创立。在1987年,他们成功推出了全球第一支无线耳机,这一创新产品迅速在市场上获得了巨大的成功。这一成就的背后,是创始人在一次偶然中被家里的电线绊倒后产生的灵感。他意识到,将有线耳机转变为无线耳机将带来巨大的便利和舒适体验。这一创新不仅改变了耳机行业的格局,也为BRIGHT公司奠定了坚实的基础。

GAPTEC Electronic GmbH & Co. KG公司的发展小趣事

背景:随着市场需求的不断增长,Galaxy Microelectronics意识到需要不断迭代技术和扩大产能。

发展:2010年,公司成功研发出3D V-NAND技术,这一技术革命性地提高了存储密度和性能,降低了功耗。同时,公司开始在全球范围内建设新的生产基地,以满足日益增长的市场需求。通过技术迭代和产能扩张,Galaxy Microelectronics逐渐成为了全球闪存市场的领军企业之一。

展恒电子(Broadic)公司的发展小趣事

2012年,展恒电子与FANSO(孚安特)签订战略合作协议,共同向智能电表厂家提供配套销售服务。这一合作不仅拓宽了展恒电子的销售渠道,也提升了公司在智能电表市场的影响力。此后,展恒电子继续与多家知名企业建立战略合作关系,通过资源共享和优势互补,实现了共赢发展。

问答坊 | AI 解惑

一点PCB方面的小知识

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语言,熟练掌握嵌入式系统架构、原理。 热爱本职工作,具有较强的团队合作精神。 诚实、 ...…

查看全部问答>

CODEC音频的问题

请问:怎样将CODEC的音频源从SDRAM或者CPU或者MIC,切换到从蓝牙输入,谢谢! 如题:…

查看全部问答>

2410 ECC 问题

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 ...…

查看全部问答>

我想在Wince的系统托盘中实现气球提示功能,请高手指点指点

如题,为什么当鼠标移动到托盘图标上时,不显示提示信息呢?…

查看全部问答>

linux内核完全剖析 基于0.12内核 txt下载

linux内核完全剖析 基于0.12内核 赵炯 的  200901的  txt doc pdf 的下载版本地址 谁有就给个链接吧 谢谢了哈  嘿嘿…

查看全部问答>

GNU(GNU_ARM_Toolchain为主)编程 记录

本帖最后由 辛昕 于 2014-12-4 00:04 编辑       这算是前面 那个 Contiki系列的续编。不过,相对来说,我觉得它比较独立。       一直以来,用GCC编程是我的习惯,只不过,那也仅限于PC上的程序。而一 ...…

查看全部问答>