STM8L USART串口使用

STM8L 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位进行切换。

Bits 5:4 USART1TR_REMAP[1:0]: USART1_TX and USART1_RX remapping
00: USART1_TX on PC3 and USART1_RX on PC2
01: USART1_TX on PA2 and USART1_RX on PA3
10: USART1_TX on PC5 and USART1_RX on PC6
11: Reserved

初始化:

// USART init
 USART_DeInit(USART1);  

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

 // 初始化参数
USART_Init(USART1, 
             (uint32_t)9600, 
             USART_WordLength_8b, 
             USART_StopBits_1, 
             USART_Parity_No, 
             USART_Mode_Rx | USART_Mode_Tx);  // 允许读和写

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

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

关闭串口

GPIO_ExternalPullUpConfig(GPIOC, GPIO_Pin_2 | GPIO_Pin_3, DISABLE);
 USART_Cmd(USART1, DISABLE );
 USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
 USART_ITConfig(USART1, USART_IT_TC, DISABLE);

读写处理(异步)

void uart_begin_read(uint8_t len)
{
// prepare send data
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

 // 初始化读缓冲
read_idx = 0;
 read_len = len;

 // 开始读(开读中断)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

}

void uart_begin_write(uint8_t* data, uint8_t len)
{
// prepare send data
USART_ITConfig(USART1, USART_IT_TC, DISABLE);

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

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

 return;

}

中断处理

// 写中断处理
INTERRUPT_HANDLER(USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQHandler, 27)
{
// 发送1字节
USART_SendData8(USART1, writ_buffer[writ_idx++]);
USART_ClearITPendingBit(USART1, USART_IT_TC);

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

}

// 读中断处理
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler, 28)
{
uint8_t temp = 0;

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

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

}

上面示例是异步读写,加一个状态等待的循环判断,可改为同步读写。

你可能感兴趣的:(STM8S)