目标MCU:STM8L051F3
功能:串口中断发送。(区别于串口轮询发送)
drv_usart.c
/*****************************************************************************************
* Confidential and Proprietary Information of xxx Corporation
* (C) 2019 ,xxx Corporation . All rights reserved.
* file : drv_usart.c
* brief : .c files
* History: Author Version ChangeContent Date
* xxx NewFile 2019.04.28
*****************************************************************************************/
/**********************************************
* 头文件引用
**********************************************/
#include "drv_usart.h"
/**********************************************
* 静态全局变量定义
**********************************************/
/**********************************************
*全局变量定义
**********************************************/
drv_usart_s m_usart_s;
/**********************************************
* 内部函数声明
**********************************************/
static void Drv_USART_EndTransmit_IT(void);
static void Drv_USART_ParaInit(void);
static void Drv_USART_SendByte( u8 sendData );
/**********************************************
* 全局函数实现体
**********************************************/
/****************************************************************************************
* FunctionName : drvUsart_init
* Abstract : Init Usart driver.
* Argument1(in) : void
* Argument2(out) :
* Return Value : void
* Remarks :
* Create : 2019/04/28 , DJWT_zhenggp New
* History :
****************************************************************************************/
void drvUsart_init(void)
{
/*PA2 --> USART_TX
*PA3 --> USART_RX*/
// PA3 USART_RX config
PA_DDR_DDR3 = 0; //输入
PA_CR1_C13 = 1; //上拉输入
PA_CR2_C23 = 0;
// PA2 USART_TX config
PA_ODR_ODR2 = 1;
PA_CR1_C12 = 1; //推挽输出
PA_CR2_C22 = 1; //输出摆率10M
PA_DDR_DDR2 = 1; //输出高电平,TX空闲状态为高电平,如果不设置,会莫名奇妙的发送0x00
/* USART2 --> PCKEN33, USART3 --> PCKEN34*/
CLK_PCKENR1_PCKEN15 = 1; //开启USART1外设时钟
//开启引脚的UART功能,功能复用为USART功能引脚
//00: USART1_TX on PC2 and USART1_RX on PC3
//01: USART1_TX on PA2 and USART1_RX on PA3
//10: USART1_TX on PC5 and USART1_RX on PC6
SYSCFG_RMPCR1_USART1TR_REMAP = 1; // system configuration PA2,PA3
//设置串口工作方式
USART1_CR1_M = 0; // 1 Start bit, 8 Data bits
USART1_CR3_STOP0 = 0; // 1 STOP bit
USART1_CR3_STOP1 = 0;
USART1_CR1_PCEN = 0; /* No Parity : Parity control disabled */
//设置波特率
//波特率设置为9600
// 2000000/9600=208.333
//208.333(DEC)=00D0(HEX)
USART1_BRR2 = 0x00; //the BRR2 should be programmed before BRR1
USART1_BRR1 = 0x0D;
// USART1_CR2_TEN = 1; //使能发送
// USART1_CR2_TIEN=0; //打开发送中断
// USART1_CR2_TCIEN = 1; //打开发送完成中断
USART1_CR2_REN = 1; //使能接收
USART1_CR2_RIEN = 1; //打开接收中断
USART1_CR1_USARTD = 0; //Enable the USART peripheral
Drv_USART_ParaInit();
}
/****************************************************************************************
* FunctionName : Drv_USART_ParaInit
* Abstract :
* Argument1(in) : void
* Argument2(out) :
* Return Value : void
* Remarks :
* Create : 2018/12/08 , DJWT_zhenggp New
* History :
****************************************************************************************/
static void Drv_USART_ParaInit(void)
{
m_usart_s.sendBuf_p = NULL;
}
/****************************************************************************************
* FunctionName : Drv_USART_Rx_IRQHandler
* Abstract : usart rx interrupt handler.
* Argument1(in) : void
* Argument2(out) :
* Return Value : void
* Remarks :
* Create : 2019/04/28 , DJWT_zhenggp New
* History :
****************************************************************************************/
#pragma vector = USART_R_RXNE_vector
__interrupt void Drv_USART_Rx_IRQHandler(void)
{
if( 1 == USART1_SR_RXNE )
{
}
}
/****************************************************************************************
* FunctionName : Drv_USART_Tx_IRQHandler
* Abstract : usart tx interrupt handler.
* Argument1(in) : void
* Argument2(out) :
* Return Value : void
* Remarks :
* Create : 2019/04/28 , DJWT_zhenggp New
* History :
****************************************************************************************/
#pragma vector = USART_T_TC_vector
__interrupt void Drv_USART_Tx_IRQHandler(void)
{
if( (RESET != USART1_SR_TC) && (RESET != USART1_CR2_TCIEN) )
{
Drv_USART_EndTransmit_IT();
}
}
/****************************************************************************************
* FunctionName : Drv_USART_SendByte
* Abstract : usart send byte data.
* Argument1(in) : void
* Argument2(out) :
* Return Value : void
* Remarks :
* Create : 2018/12/18 , DJWT_zhenggp New
* History :
****************************************************************************************/
static void Drv_USART_SendByte( u8 sendData )
{
USART1_DR = sendData;
}
/****************************************************************************************
* FunctionName : Drv_USART_EndTransmit_IT
* Abstract : Wrap up transmission in non-blocking mode.
* Argument1(in) : void
* Argument2(out) :
* Return Value : void
* Remarks :
* Create : 2018/12/18 , DJWT_zhenggp New
* History :
****************************************************************************************/
static void Drv_USART_EndTransmit_IT(void)
{
static const u8* strEnd = "rn";
if( NULL != m_usart_s.sendBuf_p ){
if( '