[STM8] STM8L USART串口使用

[复制链接]
5311|13
 楼主| mintspring 发表于 2018-10-16 11:55 | 显示全部楼层 |阅读模式
USART串口使用
STM8L上有多个串口,最多可达5个,分别为USART1~USART5,但依据型号不同,搭载数量并不相同。
以STM8L052R8为例,其只具有USART1~USART3。
因为STM8系列功能众多,很多Pin都是复用的,因此使用前必须检查STML的参考手册。
通过手册可知,以USART1为例,RX/TX可以使用以下的管脚,默认是PC2/PC3,
如果要变更,需要修改SYSCFG remap control register 1 (SYSCFG_RMPCR1)的5:4位进行切换。
  1. Bits 5:4 USART1TR_REMAP[1:0]: USART1_TX and USART1_RX remapping
  2. 00: USART1_TX on PC3 and USART1_RX on PC2
  3. 01: USART1_TX on PA2 and USART1_RX on PA3
  4. 10: USART1_TX on PC5 and USART1_RX on PC6
  5. 11: Reserved


 楼主| mintspring 发表于 2018-10-16 11:56 | 显示全部楼层
初始化:
  1.     // USART init
  2.     USART_DeInit(USART1);  

  3.     // PC2-RX PC3-TX 端口上拉
  4.     GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, ENABLE);

  5.     // 初始化参数
  6.     USART_Init(USART1,
  7.                 (uint32_t)9600,
  8.                 USART_WordLength_8b,
  9.                 USART_StopBits_1,
  10.                 USART_Parity_No,
  11.                 USART_Mode_Rx | USART_Mode_Tx);  // 允许读和写

  12.     // 开中断
  13.     // 一般需要写时再开写中断,否则写中断会非常频繁以至于始终在执行中断
  14.     // 读中断看具体业务
  15.     //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   
  16.     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);

  17.     /* Enable USART 使能 */
  18.     USART_Cmd(USART1, ENABLE);



 楼主| mintspring 发表于 2018-10-16 11:57 | 显示全部楼层
关闭串口
  1. GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, DISABLE);
  2.     USART_Cmd(USART1, DISABLE );
  3.     USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  4.     USART_ITConfig(USART1, USART_IT_TC, DISABLE);

读写处理(异步)

  1. void uart_begin_read(uint8_t len)
  2. {
  3.     // prepare send data
  4.     USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

  5.     // 初始化读缓冲
  6.     read_idx = 0;
  7.     read_len = len;

  8.     // 开始读(开读中断)
  9.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  10. }

  11. void uart_begin_write(uint8_t* data, uint8_t len)
  12. {
  13.     // prepare send data
  14.     USART_ITConfig(USART1, USART_IT_TC, DISABLE);

  15.     // 初始化写缓冲(复制待写数据等)
  16.     memcpy(writ_buffer, data, len);
  17.     writ_idx = 0;
  18.     writ_len = len;

  19.     // 开始写(开写中断)
  20.     USART_ITConfig(USART1, USART_IT_TC, ENABLE);

  21.     return;
  22. }


 楼主| mintspring 发表于 2018-10-16 11:58 | 显示全部楼层
中断处理
  1. // 写中断处理
  2. INTERRUPT_HANDLER(USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler, 27)
  3. {
  4.     // 发送1字节
  5.     USART_SendData8(USART1, writ_buffer[writ_idx++]);
  6.     USART_ClearITPendingBit(USART1, USART_IT_TC);

  7.     // 等待缓冲数据全部写出后,关写中断
  8.     if( writ_idx == writ_len ) {
  9.         USART_ITConfig(USART1, USART_IT_TC, DISABLE);
  10.         // 你的处理
  11.     }
  12. }

  13. // 读中断处理
  14. INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)
  15. {
  16.     uint8_t temp = 0;

  17.     // 读1字节,存入读缓区
  18.     temp = USART_ReceiveData8(USART1);
  19.     read_buffer[read_idx++] = temp;

  20.     // 等待全部读完后(如果有设定读长度的话)关读中断
  21.     // 这里根据具体业务,可以不关中断一直接受数据
  22.     if( read_idx == read_len ) {
  23.         USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  24.     }
  25. }



 楼主| mintspring 发表于 2018-10-16 14:36 | 显示全部楼层
上面示例是异步读写,加一个状态等待的循环判断,可改为同步读写。
643757107 发表于 2018-10-16 16:31 | 显示全部楼层
这个STM8有没有类似cubeMX的配置工具
稳稳の幸福 发表于 2018-10-16 20:13 | 显示全部楼层
如果有图形化配置工具就好了。
huangcunxiake 发表于 2018-10-16 21:38 | 显示全部楼层
这个是STM的自己内核单片机,跟其他的不太一样
stm32jy 发表于 2018-10-16 23:32 | 显示全部楼层
stm32jy 发表于 2018-10-16 23:32 | 显示全部楼层
手里有块STM8 也想玩一下
callhgd 发表于 2018-10-18 14:18 | 显示全部楼层
采用STM8的库函数编写,不错。
keaibukelian 发表于 2018-10-22 12:57 | 显示全部楼层
串口最常用 也最简单了
renzheshengui 发表于 2018-10-22 15:01 | 显示全部楼层
很详细 代码很清楚
蝴蝶泉2018 发表于 2018-10-22 15:24 | 显示全部楼层
stm8 cubeMx可以用于前期的选择方案
您需要登录后才可以回帖 登录 | 注册

本版积分规则

303

主题

4972

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部