STM32/STM8L/STM8S系列之二、UART/USART

一、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); //等待发送完毕 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值