STM32 IO口模拟串口通讯

发布者:admin 发布时间:2019-10-21 20:36 浏览次数:

  前阵子,调项目时需要用到低波特率串口通讯(300的波特率),才发下发现在正常情况下(PCLK1时钟频率为72M,PCLK2时钟频率为36M):STM32的USART0的最低波特率只能设置到1200,;而USART1最低波特率只能设置到600。怎么设置STM32的600或以下的波特率呢?有两种方法:一种是改变外设时钟频率,而另一种方法就是使用IO口模拟串口通讯。今天就来讲讲,用IO口模拟串口通信!

  首先,必须要知道串口通讯时数据是怎样传输的?这里以异步传输字符为例子,如下图所示:

  一般字符传输都采用:1位起始位,8位数据位,1位停止位,没有校验位 的形式传输,其他形式的这里不讲。串口异步传输在空闲状态时都必须是高电平。第一位传输的是起始位,起始位会将原来空闲时的高电平拉成低电平,起始位用来来标识数据开始传输,提示接收方准备开始接收数据;当接收方第一次检测到一个下降沿时,就表示接收到了起始位。起始位后就是8位的数据位,接收方在接收每一位数据的时候会采集几十次,如果结果都是低电平,则接收到的数据位0,如果结果都是高电平,则棘手到的数据位是1。1位停止位会将电平拉成高电平,以为接收下一个数据做准备。

  IO口模拟串口发送数据,必须严格按照上面的异步传输协议。我们用伪代码实现这一过程:

  代码很简单,思路也很清晰,完全是按照异步传输的过程写的。这里最重要的是Delay(sometime),sometime的延时时间就决定了传输的速度,sometime去取某些值才可以设置程序标准的串口波特率(1200、2400、9600、38400、115200等等)。

  我选择PA4引脚来模拟串口的TX引脚,所以需要配置下PA4这个引脚为推挽输出:

  这里需要说明的是,在配置完引脚后,需要将PA4引脚拉高,这样做是为了防止在发送数据起始位时,由于原来引脚是低电平而导致没有产生一个下降沿信号。

  接收的代码比发送的代码复杂些。先讲讲怎么IO口接收数据的思路。为了接收数据,IO引脚必须可以检测到传输数据的起始位,检测起始位其实相当于与要检测一个下降沿信号,那么引脚只要配置成外部中断模式就可以检测到这个起始信号。然后根据传输速率配置一个相应时间定时的定时器。当检测到起始信号后,打开该定时器,每隔一定时间就会进入定时器中断,检测当前的IO引脚高低电平,从而决定接收到的数据是‘1’还是‘0’。当第九次进入定时器中断服务程序时,说明已经收到了一个字节的数据,此时关闭定时器。

  我选择PA5来模拟串口的接收引脚RX,所以需要配置PA5为输入模式,同时打开它的外部中断。

  我配置TIM2定时器为一定的定时周期,在它的中断服务程序中读取串口发送过来数据。定时器配置代码如下:

  IO口接收串口数据的功能是通过PA5引脚的外部中断服务程序与定时器的中断服务程序相互配合实现的。首先需要为数据定一些状态机,方便标识接收到数据的状态:

  定义好了状态机,还需要一个变量,来保存这些状态机的变化,并定义它的初始状态为COM_STOP_BIT:

  下面是PA5的外部中断服务程序,它的主要任务是检测起始位,当他第一次检测到下降沿,则说明数据即将到来,这时只要打开定时器就可以了:

  上面代码中,检测到下降沿并设置了状态之后,延时了一定的时候,才打开定时器,这样做的原因是让定时器每次在信号的中间检测,而不要在信号边沿检测。正如下面图所示:

  下面就是定时器的中断服务程序,它主要是接收串口发送过来的数据,在它之前我们需要线定义一个变量用来保存接收到的数据:

  然后,定时器中断中,每收到1位数据就改变下状态机并同时写入这个recvData对应的数据位中,当收到8为数据后,然后关闭定时器定时,以等待新的数据到来:

  上面代码中,需要定义一个不精确定时与两个精确定时,分别用在检测到下降沿后延时一段时间在打开定时器和控制传输速率中:

  这里能配置的只有300、600、1200三种波特率,其他的波特率我不想弄,也没有必要弄。下面编写一个初始化IO模拟的串口,包括引脚配置、波特率设置、定时时间设置等:

  要问上面的那些数字是怎么得来的,实话说:我是试出来,但是是有根据地试出来的。我以波特率为1200为例:IO串口发送函数VirtualCOM_ByteSend()中,我们用Delay_us(delayTime)来控制传输的速率,如果波特率设为1200,则1/1200=830us相当于没830us传输1bit数据,所以在delayTime理论上应该设为830才能保证以波特率1200的速率发送数据,但是由于发送是由代码实现,有一定的延时,而不像真正串口通过移位寄存器发送那样快速,所以需要将delayTime的值在830附近调整,最后我试出来delayTime=800时,正好实现了波特率为1200的速率发送。

  同样的,在IO串口接收时,需要设定定时周期,这个周期也是试出来的,但是也是有依据的。还是以1200波特率接收为例:理论上应该设置定时时间为1/1200=830us,则需要的定时值为72000000/(1/830us)=72*830,这里设置定时器的预分频为72,则周期值应该为830,所以上面代码中period的理论上应该等于830,但是接收是由代码写成的,有一定的延时,而不像真正串口一样全部有硬件完成那样快速,所以需要将period的值在830附近调整,最后试出来period=850时,可以正常接收串口发送过来的数据。

  首先需要编写的BSP_Init()函数,来初始化板子的其他一些外设的的初始化:

  最后是main函数,main函数很简单,只要调用配置IO串口的配置函数就可以了:

  首先。我们需要用TTL转USB的串口线,连接到电脑,打开串口调试工具,设置波特率为600,1位停止位,然后就可以收到IO模拟串口发过来的HelloWorld,然后,我们发送一个字符a过去,然后就会每间隔一段时间打印出该字符。如下图所示:

  本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  STM32解决:Error: Flash Download failed - Cortex-M3本人由于使用普中科技的stm32 的开发板的 USB的下载的地方坏了,所以不得不使用arm仿真器 st-link 进行下载。鼓捣了半天下面总结一下几个问题:1、st-link的驱动下载首先你插上st-link的时候,电脑的设备管理器这个地方是有感叹号的,说明还没有装好驱动,所以我就在网上找啊找。终于根据:win8【笔者没这个系统,无法测试,请大家测试后报告】:(转载来自:

  问题: stm32(stm32f103c8T6)开发板只能通过串口烧录程序,而st—link居然不行描述:解决:st-link固件升级用stm32cubemx快速开发时没有配置好调试模式重新生成代码就可以了如果还是不行的话,就得升级一下stlink固件了,具体升级方法可百度

  在某宝上买了五个最小系统核心板是STM32F103C8T6的芯片,刚拿到手准备下载程序调试,上电后板子自带LED闪烁,这是商家自己下载的示例程序,说明芯片工作着,用KEIL4进行下载自己程序,把自己编译好的程序下载。用的JLINK的四线下载调试下载口,SW的调试接口,点击下载后发现擦除成功,下载失败,提示:Load ..\Output\STM32-DEMO.axfSet JLink Project File to F:文件RFID程序电机* JLink Info: Device STM32

  /scripts/target/stm32f4x_stlink.cfg在执行完此条指令后该终端就会一直执行OpenOCD的程序了,不要关闭它,我们再打开一个终端界面,进入我们的工程目录,比如我这里进入的就是我的libopencm3样例工程下的blink子工程目录。$ cd /home/yangliu/workspace/libopencm3-my-example/blink然后我们使用指令输入调试文件并打开GDB程序。$ arm-none-eabi-gdb blink.elf然后我们在GDB的指令界面中,输入连接指令,连接本地的3333端口。(gdb)target remote localhost:3333此时

  SW4STM32安装其实固件库安装过程很简单,在第一次新建工程时会提示选择使用Stdperiph 驱动还是Cube HAL,由于Stm32官方大力推行Cube HAL固件库,所以Cube HAL的固件库直接可以从网上直接一键下载安装。然而对于老的StdPeriph固件库不能一键式下载安装,会提示出错。所以,我们需要自己下载一个.zip固件包,放在C:UsersLYAppDataRoamingAc6SW4STM32firmwares文件夹下,其中的LY就是计算机的用户名。然后新建工程时在选择Stdperiph固件时会自动解压缩,这样就能使用该库进行编译了。界面如下所示:工程配置器件与时钟或者,修改晶振与时钟,根据注释可以算得

  1、背景外设驱动的寄存器设置对于外设功能正常运行异常重要。现在对GPIO的配置进行总结。2、GPIO的配置总结复用GPIO配置GPIO设置为输出或者是复用模式时,需要设置输出速度;而无论设置为什么模式,都要对GPIO的内部上下拉进行设置。注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!

  基于STM32F103RBT6的GPIO中断控制机LED显示控制(基于MDK编程模板)

  基于STM32F103RBT6的三个红外的智能循迹小车,本人亲测可运行

  单片机模拟串口通讯I/O口模拟232通讯程序使用两种方式的C程序 占用定时器0

  TI直播:精讲“电动汽车车载充电器”一款候选方案,会不会被工程师种草?

  站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430C2000单片机论坛单片机资源下载单片机习题与教程


上一篇:arduino 模拟口 输出    下一篇:临床助理医师考试模拟练习题(复苏)