你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的USART编程

[复制链接]
STMCU小助手 发布时间:2022-10-12 22:30
数据的发送
TE标志位

1.要想使串口能够发送数据,必须置位TE标志位,并且在写入发送寄存器TDR之前置位。
2.当TE位置位,会产生一个空闲帧。
3.数据传输过程中,复位TE,会导致数据发送错误,波特率产生器会冻结。
TXE状态标志位
该位由硬件置位,它表示:
1.数据已从 USART_TDR 寄存器移至移位寄存器,并且数据传输已经开始。
2.USART_TDR 寄存器为空。
3.下一个数据可以写入 USART_TDR 寄存器而无需覆盖以前的数据。

如果 TXEIE 置位,会产生一个中断

该标志位清除方法:

1.写入新数据到USART_TDR
2.USART_RQR中的TXFRQ置位刷新该标志位

TC标志位
该标准位代表发送结束,如图。

20210629180704224.png

发送数据的配置顺序
1.配置CR1寄存器的M标志位,即配置数据长度;
2.配置波特率;
3.配置停止位长度;
4.通过置位CR1的UE标志位使能USART模块;
5.如果需要配置DMA可在CR3寄存器配置DMA;
6.置位CR1寄存器的TE标志位,发送一个空闲帧;
7.将要发送的数据写入TDR寄存器,如果在单数据传输模式,TXE会被清除;
8.最后一个数据被写入TDR寄存器后,等待TC标志位置位,表示最后一帧数据发送完成。

数据的读取
RXNE状态标志位

当该标志位置位,代表:
1.移位寄存器的内容被传送到TRD寄存器,可读;
2.如果使能RXNEIE标志位可产生中断

接收数据的配置顺序
配置CR1寄存器的M标志位,即配置数据长度;
配置波特率;
配置停止位长度;
通过置位CR1的UE标志位使能USART模块;
如果需要配置DMA可在CR3寄存器配置DMA;
置位CR1寄存器的RE标志位,RX开始寻找起始帧。

20210629143638147.png

20210629143838417.png

fCK在RCC_CGFR3寄存器中配置

20210629152814395.png

例: SYSCLK频率为72MHz,想要得到19200的波特率,则:
将USARTSW配置为01,即SYSCLK

19200 = 72000000 / USARTDIV

OVER8不置位 则BBR = 3750十六进制为0x0EA6。

注意:

1.如果调试过程中,单片机读不到数据,但是能发送数据,可能是外部没有上拉,此时可以配置引脚内部 上拉进行调试,有了上拉以后,串口才能读 到数据

2.Modbus的地址为1,实际发出的地址是0;CAN的地址为1,实际发送的也是1。两种协议的区别。

3.不清除中断标志位会导致一直进入中断,可在中断中关闭中断使能从而避免一直进入中断

附录
寄存器|初始化

  1. void USART1_Init(void)
  2. {
  3. /*
  4. 在RCC_CFGR寄存器中配置USART时钟源fCK
  5. 当前配置为SYSCLK 72MHz
  6. */
  7.         //步骤1  配置CR1寄存器的M标志位,即配置数据长度
  8.         USART1->CR1 = (USART1->CR1 & 0xe000000)
  9.         // |0x10000000                                        //bit28:【00|1起始位,8数据位】【01|1起始位,9数据位】【10|1起始位,7数据位】
  10.         // |USART_CR1_EOBIE                        //bit27:【1|EOBF标志位中断使能】
  11.         // |USART_CR1_RTOIE                        //bit26:【1|RTOF标志位中断使能】
  12.         // |USART_CR1_DEAT                                //bit[25:21]:DE时间
  13.         // |USART_CR1_DEDT                                //bit[20:16]:DE时间
  14.         // |USART_CR1_OVER8                        //bit15:【0|过采样/16】【1|过采样/8】
  15.         // |USART_CR1_CMIE                                //bit14:字符匹配中断使能(CMF标志位)
  16.         // |USART_CR1_MME                                //bit13:静音模式使能【0|一直活动】【1|静音模式】配合WAKE唤醒
  17.         // |USART_CR1_M                                //bit12:【00|1起始位,8数据位】【01|1起始位,9数据位】【10|1起始位,7数据位】
  18.         // |USART_CR1_WAKE                                //bit11:唤醒方法配置【0|空闲总线唤醒】【1|地址唤醒】
  19.         // |USART_CR1_PCE                                //bit10:奇偶校验使能
  20.         // |USART_CR1_PS                                //bit09:【0|偶校验】【1|奇校验】
  21.         // |USART_CR1_PEIE                                //bit08:PE中断使能位
  22.         // |USART_CR1_TXEIE                        //bit07:TXE中断使能位
  23.         // |USART_CR1_TCIE                                //bit06:TC中断使能位
  24.         // |USART_CR1_RXNEIE                        //bit05:RXNE/ORE中断使能位
  25.         // |USART_CR1_IDLEIE                        //bit04:IDLE中断使能位
  26.         // |USART_CR1_TE                                //bit03:发送使能
  27.         // |USART_CR1_RE                                //bit02:接收使能
  28.         // |USART_CR1_UESM                                //bit01:【0|USART不能在停止模式唤醒】【1|当配置USART的RCC时钟,可以在停止模式被唤醒】
  29.         // |USART_CR1_UE                                //bit00:使能USART模块
  30.         ;
  31.         
  32.         //步骤2 设置波特率
  33.         // USART1->BRR = 0x0EA6;                        //bit[15:4]:USARTDIV[15:4]//72000000/19200 = 3750
  34.         USART1->BRR = 1250;                        //bit[15:4]:USARTDIV[15:4]//72000000/57600 = 1250
  35.                                                                 //bit[3:0]:【OVER8=0| USARTDIV[3:0]】【OVER8=1| USARTDIV[3:0]右移1位,此时BIT3必须为0】
  36.         
  37.         //步骤3 配置停止位长度
  38.         USART1->CR2 = (USART1->CR2 & 0x0000008f)
  39.         // |USART_CR2_ADD                                //bit[31:24]:地址匹配或者数据匹配的数据
  40.         // |USART_CR2_RTOEN                        //bit23:接收超时使能
  41.         // |USART_CR2_ABRMODE_1                //bit[22:21]:【00|起始位检测】【01|start->10检测】
  42.         // |USART_CR2_ABRMODE_0                //自动波特率检测        【10|0x7f检测】【11|0x55检测】
  43.         // |USART_CR2_ABREN                        //bit20:自动波特率检测使能【0|禁止】【1|使能】
  44.         // |USART_CR2_MSBFIRST                        //bit19:【0|先发送低位】【1|先发送高位】
  45.         // |USART_CR2_DATAINV                        //bit18:【0|正常】【1|二进制取反(1对应低电平)】
  46.         // |USART_CR2_TXINV                        //bit17:【0|正常(VDD为空闲)】【1|TX引脚认为VDD为忙,GND为空闲】
  47.         // |USART_CR2_RXINV                        //bit16:【0|正常(VDD为空闲)】【1|RX引脚认为VDD为忙,GND为空闲】
  48.         // |USART_CR2_SWAP                                //bit15:【0|正常】【1|TX和RX引脚功能调换】
  49.         // |USART_CR2_LINEN                        //bit14:LIN总线使能
  50.         // |USART_CR2_STOP_1                        //bit[13:12]:【00|1停止位】【01|0.5停止位】
  51.         // |USART_CR2_STOP_0                        //停止位选择        【10|2停止位】【11|1.5停止位】
  52.         // |USART_CR2_CLKEN                        //bit11:CK引脚使能标志位
  53.         // |USART_CR2_CPOL                                //bit10:【0|低值稳定】【1|高值稳定】
  54.         // |USART_CR2_CPHA                         //bit09:【第一个时钟沿发送或接受数据】【第二个时钟沿发送或接受数据】
  55.         // |USART_CR2_LBCL                                //bit08:【0|最后一个数据位的时钟脉冲不输出到CK引脚】【1|最后一个数据位的时钟脉冲输出到CK引脚】
  56.         // |USART_CR2_LBDIE                        //bit06:LBDF标志位中断使能
  57.         // |USART_CR2_LBDL                                //bit05:该位用于在 11 位或 10 位中断检测之间进行选择。【0|10位断点检测】【1|11位断点检测】
  58.         // |USART_CR2_ADDM7                        //bit04:【0|4位地址检测】【1|7位地址检测】
  59.         ;


  60.         //步骤5 配置DMA
  61.         USART1->CR3 = 0
  62.         // |USART_CR3_WUFIE                        //bit22:WUF标志位中断使能(停止模式唤醒)
  63.         // |USART_CR3_WUS_1                        //bit[21:20]:【00|当地址相同置位】【01|Reserve】
  64.         // |USART_CR3_WUS_0                        //唤醒停止中断标志位选择【WUF在起始位置位】【WUF在RXNE置位】
  65.         // |USART_CR3_SCARCNT                        //bit[19:17]:智能卡自动重复计数
  66.         // |USART_CR3_DEP                                //bit15:【0|DE信号高电平有效】【1|DE信号低电平有效】Driver Enable -> DE
  67.         // |USART_CR3_DEM                                //bit14:【0|DE信号禁止】【1|DE信号使能】
  68.         // |USART_CR3_DDRE                                //bit13:接收错误时禁止DMA【0|接收错误后仅置位标志位,不禁止DMA】【1|接收错误后禁止DMA】
  69.         // |USART_CR3_OVRDIS                        //bit12:【0|溢出后,置位ORE】【1|溢出后不置位ORE】
  70.         // |USART_CR3_ONEBIT                        //bit11:【0|3bit采样法】【1|1bit采样法】
  71.         // |USART_CR3_CTSIE                        //bit10:CTS中断使能
  72.         // |USART_CR3_CTSE                                //bit09:CTS使能
  73.         // |USART_CR3_RTSE                                //bit08:RTS使能
  74.         // |USART_CR3_DMAT                                //bit07:DMA使能发送
  75.         // |USART_CR3_DMAR                                //bit06:DMA使能接收
  76.         // |USART_CR3_SCEN                                //bit05:智能卡模式使能【1|使能】
  77.         // |USART_CR3_NACK                                //bit04:【0|就校验错误NACK不传输】【1|奇偶校验错误NACK传输】
  78.         // |USART_CR3_HDSEL                        //bit03:单线半双工模式选择【1|半双工模式】
  79.         // |USART_CR3_IRLP                                //bit02:【1|IrDA低功耗模式】
  80.         // |USART_CR3_IREN                                //bit01:【1|IrDA模式使能】
  81.         // |USART_CR3_EIE                                //bit00:错误中断使能标志位
  82.         ;

  83.         //步骤6 置位CR1寄存器的RE标志位,RX开始寻找起始帧。
  84.         USART1->CR1 |= USART_CR1_RXNEIE | USART_CR1_RE;

  85.         //步骤4 通过置位CR1的UE标志位使能USART模块
  86.         USART1->CR1 |= USART_CR1_UE;
  87.         USART1->GTPR = 0x0000
  88.         // |(0 << 8)                                        //bit[15:8]:Guard Time 守护时间        GT[7:0]
  89.         // |0x00                                                //bit[7:0]:分频值(page946)                PSC[7:0]
  90.         ;

  91.         USART1->RTOR = 0x00000000
  92.         // |(0 << 24)                                        //bit[31:24]:块长度
  93.         // |0x000000                                        //bit[23:0]:接收超时值
  94.         ;

  95.         USART1->RQR = (USART1->RQR & 0xffffffe0)
  96.         // |USART_RQR_TXFRQ                        //bit04:发送数据刷新请求,置位TXE
  97.         // |USART_RQR_RXFRQ                        //bit03:接收数据刷新请求,清除RXNE
  98.         // |USART_RQR_MMRQ                                //bit02:静音模式刷新请求,置位RWU,同时USART进入静音模式
  99.         // |USART_RQR_SBKRQ                        //bit01:截止请求,置位SBKF
  100.         // |USART_RQR_ABRRQ                        //bit00:自动模特率请求,置位ABRF标志位
  101.         ;

  102.         // USART1->ISR =
  103.         // USART_ISR_REACK                                //bit22:接收标志
  104.         // |USART_ISR_TEACK                        //bit21:发送标志
  105.         // |USART_ISR_WUF                                //bit20:停止模式唤醒标志
  106.         // |USART_ISR_RWU                                //bit19:静音模式唤醒标志
  107.         // |USART_ISR_SBKF                                //bit18:发送截止标志
  108.         // |USART_ISR_CMF                                //bit17:ADD字符匹配标志
  109.         // |USART_ISR_BUSY                                //bit16:忙标志
  110.         // |USART_ISR_ABRF                                //bit15:自动波特率错误标志
  111.         // |USART_ISR_ABRE                                //bit14:自动波特率状态错误标志你,,,,

  112.         // |USART_ISR_EOBF                                //bit12:块结束标志
  113.         // |USART_ISR_RTOF                                //bit11:接收超时标志
  114.         // |USART_ISR_CTS                                //bit10:CTS标志
  115.         // |USART_ISR_CTSIF                        //bit09:CTS中断标志
  116.         // |USART_ISR_LBD                                //bit08:LIN截止侦查标志
  117.         // |USART_ISR_TXE                                //bit07:发送数据寄存器空标志
  118.         // |USART_ISR_TC                                //bit06:发送完成标志
  119.         // |USART_ISR_RXNE                                //bit05:读数据寄存器不空标志
  120.         // |USART_ISR_IDLE                                //bit04:总线空标志
  121.         // |USART_ISR_ORE                                //bit03:溢出标志
  122.         // |USART_ISR_NE                                //bit02:起始位检测标志
  123.         // |USART_ISR_FE                                //bit01:帧错误标志
  124.         // |USART_ISR_PE                                //bit00:校验错误标志

  125.         USART1->ICR = (USART1->ICR & 0xffede4a0)
  126.         // |USART_ICR_WUCF                                        //bit20:写1清除标志位
  127.         // |USART_ICR_CMCF                                        //bit17:写1清除标志位
  128.         // |USART_ICR_EOBCF                                //bit12:写1清除标志位
  129.         // |USART_ICR_RTOCF                                //bit11:写1清除标志位
  130.         // |USART_ICR_CTSCF                                //bit09:写1清除标志位
  131.         // |USART_ICR_LBDCF                                //bit08:写1清除标志位
  132.         // |USART_ICR_TCCF                                        //bit06:写1清除标志位
  133.         // |USART_ICR_ORECF                                //bit04:写1清除标志位
  134.         // |USART_ICR_IDLECF                                //bit03:写1清除标志位
  135.         // |USART_ICR_NCF                                        //bit02:写1清除标志位
  136.         // |USART_ICR_FECF                                        //bit01:写1清除标志位
  137.         // |USART_ICR_PECF                                        //bit00:写1清除标志位
  138.         ;

  139.         // USART1->RDR
  140.         // USART1->TDR

  141. }
复制代码

————————————————
版权声明:Vice Versa XL


收藏 评论0 发布时间:2022-10-12 22:30

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版