一、STM32F103串口
1、串口初始化
/*******************************************************************************
* FUNCTION: USART3初始化
* PARA : bound:波特率
* RETURN : 无
*******************************************************************************/
void usart3_init(u32 bound)
{
//结构体
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//USART3_TX GPIOB.10
GPIO_InitStructure.GPIO_Pin = USART3_TX_PIN; //PB.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(USART3_PORT, &GPIO_InitStructure); //初始化GPIOA_Pin9
//USART3_RX GPIOB.11
GPIO_InitStructure.GPIO_Pin = USART3_RX_PIN; //PB11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(USART3_PORT, &GPIO_InitStructure); //初始化GPIOA.10
//Usart3 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
//USART 结构体赋值
USART_InitStructure.USART_BaudRate = bound; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //USART3初始化
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//使能RXNE中断(接收数据中断)
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);//使能空闲中断
USART_Cmd(USART3, ENABLE); //使能USART3
}
2、串口x发送数据
//FUNCTION:串口发送数据
//PARA :USARTx:使用哪个串口发送数据
// :src:要发送的数据指针
// :len:要发送的数据长度
//RETURN :无
void USARTx_Send_Data(USART_TypeDef* USARTx, uint8_t * src, uint8_t len)
{
uint8_t i = 0;
for(i=0; i<len; i++)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);//等待发送完毕
USART_SendData(USARTx, *(src+i));
}
}
3、串口3中断接收程序
// FUNCTION: USART3初始化
// PARA : bound:波特率
// RETURN : 无
void USART3_IRQHandler(void)
{
u8 clear = 0;
u8 i = 0;
//1、接收中断,接收每个字节该条件成立一次。 eg:接收8个字节RXNE,依次接收,故标志位RXNE会置位8次
if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
{
/*..code..*/
USART_ClearITPendingBit(USART3,USART_IT_RXNE);//清除中断标志位(原理:只要把DR寄存器的值读出来即可)
}
//空闲中断,整包数据接收完毕该条件成立。 eg:接收8个字节,只有8个字节全部接收完毕后该条件才成立(IDLE置位)
if(USART_GetITStatus(USART3,USART_IT_IDLE) != RESET)
{
/*..code..*/
/* 清除标志位 */
clear = USART3->SR;
clear = USART3->DR;
if(clear)//消除警告,无实际意义
{
}
}
}
二、STM8L151串口
1、串口初始化
void UART1_Init(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast);//TXD
GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);//RXD
USART_DeInit(USART1); //复位UART1
USART_Init(USART1, (u32)9600, USART_WordLength_8b, USART_StopBits_1,
USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启接收中断
ITC_SetSoftwarePriority(EXTI0_IRQn, ITC_PriorityLevel_3);
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART_Cmd(USART1, ENABLE); //使能UART1
USART_ClearFlag(USART1, USART_FLAG_TC);
SYSCFG_REMAPDeInit();
SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortC,DISABLE);
}
2、串口接收中断
注意:STM8L151有个stm8l15x_it.c文件,里面是所有的中断处理函数,在这个文件中可以找到对应的串口中断处理函数,函数名为:INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28),故只需要在该函数里面直直接编写中断处理函数即可。
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
u8 clear;
//接收中断
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
{
/*..code..*/
}
//空闲中断
if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)
{
clear = USART1->SR;
clear = USART1->DR;
if(clear) //只是为了消除警告
{
;
}
/*..code..*/
}
}
3、串口发送函数
void uartSend(u8 *buff,u16 num)
{
unsigned char i;
for(i=0; i<num; i++)
{
USART_SendData8(USART1,buff[i]);
while(!USART_GetFlagStatus (USART1,USART_FLAG_TC));//等待发送完毕
}
}
4、发送换行符:
uartSend("\r\n", 2);
三、STM8S串口
1、串口初始化
// FUNCKTION:UART1配置
// PARA: bound:波特率
// RETURN: 无
void UART1_Config(u32 bound)
{
UART1_DeInit();
UART1_Init(bound, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);//中断使能
UART1_ITConfig(UART1_IT_IDLE, ENABLE);//空闲中断使能
UART1_Cmd(ENABLE);
enableInterrupts();
}
2、串口中断接收
注意:STM8S有个stm8s_it.c文件,里面是所有的中断处理函数,在这个文件中可以找到对应的串口中断处理函数,函数名为:INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18),故只需要在该函数里面直直接编写中断处理函数即可。
代码:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
u8 clear = 0;
u8 i = 0;
if(UART1_GetITStatus(UART1_IT_RXNE) == SET)
{
/*..code..*/
UART1_ClearITPendingBit(UART1_IT_RXNE);//清除中断标志位(原理:只要把DR寄存器的值读出来即可)
}
//空闲中断,整包数据接收完毕该条件成立。 eg:接收8个字节,只有8个字节全部接收完毕后该条件才成立(IDLE置位)
if(UART1_GetITStatus(UART1_IT_IDLE) != RESET)
{
/*..code..*/
/* 清除标志位 */
clear = UART1->SR;
clear = UART1->DR;
if(clear)//消除警告,无实际意义
{
}
}
3、串口发送数据
// FUNCKTION:串口发送一个字节数据
// PARA: data:要发送的数据,长度:1个字节
// RETURN: 无
void UART1_SendChar(u8 data)
{
UART1_SendData8(data);
while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //等待发送完毕
}