stm32_之【串口通信学习1】

用福昕PDF阅读器在中文datasheet中找到USART的寄存器配置:


深入底层函数:


USART CR2 CR1寄存器的配置

/*---------------------------- USART CR2 Configuration -----------------------*/
  tmpreg = USARTx->CR2;//先读取12.13位的数据
  /* Clear STOP[13:12] bits */
  tmpreg &= CR2_STOP_CLEAR_Mask;
  /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/
  /* Set STOP[13:12] bits according to USART_StopBits value */
  tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;//用或运算清除
  
  /* Write to USART CR2 */
  USARTx->CR2 = (uint16_t)tmpreg;//再写回寄存器
/*---------------------------- USART CR1 Configuration -----------------------*/
  tmpreg = USARTx->CR1;
  /* Clear M, PCE, PS, TE and RE bits */
  tmpreg &= CR1_CLEAR_Mask;
  /* Configure the USART Word Length, Parity and mode ----------------------- */
  /* Set the M bits according to USART_WordLength value */
  /* Set PCE and PS bits according to USART_Parity value */
  /* Set TE and RE bits according to USART_Mode value */
  tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
            USART_InitStruct->USART_Mode;
  /* Write to USART CR1 */
  USARTx->CR1 = (uint16_t)tmpreg;

清零:






扫描二维码关注公众号,回复: 730140 查看本文章


配置好后,往串口发数据,发了个\n(换行)是个字符ASCII码为=>0x0a


把数据发了,一定要等



深入 USART_SendData函数:

数据直接往DR寄存器里写,OK数据就发送出去了


深入DR寄存器:是个32位的寄存器,只用了bit0-bit8,9个位,一般发8个位,有时发9个位,发9个位时,基本数据类型最少要能存放16个位,short,2个字节,16个位。





但以后编程永远不要用usigned short !!!保持程序的通用性,直接使用

就好了,假设一后想发在stm8上跑,有可能另外一个cpu中unsigned short 有可能是一个字节(8位),所以直接调用uint16_t,另外的单片机的库就会写,typedef unsigned int uint16_t,这是他一定会给你保证他是8、16、32、64个位的



假如收到的值大于九个位,与0X01FF    (0000 0001 1111 1111 )b与运算

  

   & 

=>   

高位我都不要,对我来说没意义,我只要那九个位







深入分析Usart_GetFlagStatus()函数:


读SR寄存器,判断



一定是个宏


0x0040 =>0000 0000 0100 0000 第六个位 =>寄存器中TC位

读值,位操作:(x&1 =x ,x&0=0)




如果,SR(保留x xxTCx xxxx)&0x40=RESET(0) ,那么TC位(bit6)=0   ,也就是TC位发送还未完成

如果,SR(保留x xxTCx xxxx)&0x40≠RESET(0),那么TC位(bit6)=1   ,也就是TC位发送完成




什么时候数据发完呢?由寄存器SR的TC位判断

一直读TC位,你是不是1,是不是1,是不是1,是不是1,只要是1就完事儿了,串口一般不用中断,用轮询。



对于串口一、挂在clk1上

没有误差

会有误差 ,115384是实际值,

对于串口2、3

没有误差



用keil4


发到串口一上,要发到串口2,就UASRT1/USART2

有了这个函数才有printfl函数,及输出对象,调printfl时候=>调FPUTC,还要含stdio.h库



选这个库(微库)才有printfl,编译器本身自带的库。

作业


要安装驱动。在ftp站点上





1:42


receive用中断。


猜你喜欢

转载自blog.csdn.net/luoyir1997/article/details/80257346