以下是我的代码:
/* 串口接收回调函数 */
static void UsartRxIrqCallback(void)
{
if (Set == USART_GetStatus(USART_CH, UsartRxNoEmpty))
{
uint16_t RxData;
RxData = USART_RecData(USART_CH);//取出数据
// rx_buffer[0] = USART_RecData(USART_CH);
x=1;//为了在仿真时观察是否进入中断
rx_buffer[0] = ((uint8_t)RxData)&0xff;
// rx_buffer[rx_counter++] = ((uint8_t)RxData)&0xff;
// if (rx_counter > 4)
// {
// rx_counter = 0;
// }
}
}
/* 超时中断回调函数 */
static void Usart1TimeoutIrqCallback(void)
{
x=1;
TIMER0_Cmd(M4_TMR01, Tim0_ChannelA,Disable);
USART_ClearStatus(USART_CH, UsartRxTimeOut);
}
/*接收错误回调函数*/
static void UsartErrIrqCallback(void)
{
x=1;
if (Set == USART_GetStatus(USART_CH, UsartFrameErr))
{
USART_ClearStatus(USART_CH, UsartFrameErr);
}
else {}
if (Set == USART_GetStatus(USART_CH, UsartParityErr))
{
USART_ClearStatus(USART_CH, UsartParityErr);
}
else {}
if (Set == USART_GetStatus(USART_CH, UsartOverrunErr))
{
USART_ClearStatus(USART_CH, UsartOverrunErr);
}
else {}
}
/* 串口初始化配置 */
void usart1_init(void)
{
en_result_t enRet = Ok;
stc_irq_regi_conf_t stcIrqRegiCfg; //用于中断配置的结构体
/* 开启外设时钟 clock */
PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART1, Enable);
/* USART对应的引脚初始化,但是引脚先失能,防止串口还没配置完成就接收导致错误 */
PORT_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_FUNC, Disable);
PORT_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_FUNC, Disable);
const stc_usart_uart_init_t stcInitCfg = {
UsartIntClkCkNoOutput,//使用内部时钟源,不需要在其时钟输出IO上输出通信的时钟信号
UsartClkDiv_1,//始终不分频
UsartDataBits8,//一个字节8位
UsartDataLsbFirst,//先传输低位
UsartOneStopBit,//停止位1位
UsartParityNone,//无奇偶校验位
UsartSampleBit8,//每次传输1字节(8bit),也可以传输16位UsartDataBits16
UsartStartBitFallEdge,//起始位:RD pin下降沿
UsartRtsEnable,//使能RTS(串口开始传输前让RTS输出一个高脉冲信号)
};//串口参数结构体
/* 初始化 USART */
enRet = USART_UART_Init(USART_CH, &stcInitCfg);
if (enRet != Ok)
{
while (1);
}
/* 设置串口波特率 */
enRet = USART_SetBaudrate(USART_CH, USART_BAUDRATE);
if (enRet != Ok)
{
while (1);
}
/* 设置串口读取方式为中断读取 */
stcIrqRegiCfg.enIntSrc = INT_USART1_RI; //中断类型为读中断
stcIrqRegiCfg.enIRQn = Int000_IRQn; //每个中断必须有一个对应的中断号
stcIrqRegiCfg.pfnCallback = &UsartRxIrqCallback;//中断发生时候的回调函数
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_00);//中断优先级
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);//先清一下这个中断的标志位(置零)
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);//在使能这个中断
/* 当串口接收发生错误的时候产生中断 */
stcIrqRegiCfg.enIntSrc = INT_USART1_EI;
stcIrqRegiCfg.enIRQn = Int001_IRQn;
stcIrqRegiCfg.pfnCallback = &UsartErrIrqCallback;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
/* 串口接收空闲中断 */
stcIrqRegiCfg.enIntSrc = INT_USART1_RTO;//中断名称(串口1空闲中断)
stcIrqRegiCfg.enIRQn = Int003_IRQn;//中断向量
stcIrqRegiCfg.pfnCallback = &Usart1TimeoutIrqCallback;
enIrqRegistration(&stcIrqRegiCfg);
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
/* 最后使能串口的引脚和中断,串口正式工作 */
USART_FuncCmd(USART_CH, UsartRx, Enable);
USART_FuncCmd(USART_CH, UsartRxInt, Enable);
USART_FuncCmd(USART_CH, UsartTx, Enable);
USART_FuncCmd(USART_CH, UsartTxEmptyInt, Disable);
USART_FuncCmd(USART_CH, UsartTimeOut, Enable);
USART_FuncCmd(USART_CH, UsartTimeOutInt, Enable);
USART_FuncCmd(USART_CH, UsartNoiseFilter, Enable);
}
/*发送一串数据*/
void Uart1_SendString(M4_USART_TypeDef *USARTx, unsigned char *data, unsigned char strlen)
{
unsigned char dataleng;
for(dataleng=0;dataleng<strlen;dataleng++)
{
USART_SendData(USARTx,data[dataleng]);
while (Reset == USART_GetStatus(USARTx, UsartTxComplete));//等待发送完成UsartTxEmpty
}
}
本人萌新,实在是找不到出了什么问题,希望哪位前辈可以帮个忙解答一下,感恩!
搜索
复制
|