上次说写uart的中断模式,今天才开始写,主要是把我之前通过测试的配置注在这里,开发的时候会比较多使用DMA模式,中断模式配置相对也比之复杂一些。
1、初始化配置:
void InitCoreUartx(uint8_t* buffer) //Uartx uartx,
{
uint32_t temp_reg = 0, ClkDivide_1 = 0;
uint32_t fcclk = 0u;
uint32_t fsysclk = 0u;
uint32_t fsclk0 = 0u;
uint32_t fsclk1 = 0u;
uint32_t coreclk;
uint32_t systemclk;
adi_pwr_GetCoreFreq(DEV_NUM, &fcclk);
adi_pwr_GetSystemFreq(DEV_NUM, &fsysclk, &fsclk0, &fsclk1);
//配置串口波特率
ClkDivide_1 = (uint32_t) ( ((float)fsclk0 / ((float)BAUD_RATE)));
*pREG_UART0_CLK = (ENUM_UART_CLK_EN_DIV_BY_ONE|(ClkDivide_1));
//W1C清除标志
*pREG_UART0_STAT=ENUM_UART_STAT_OVR_ERR |
ENUM_UART_STAT_PARITY_ERR |
ENUM_UART_STAT_FRAMING_ERR |
ENUM_UART_STAT_BREAK_INT |
ENUM_UART_STAT_ADDR_HI_STKY |
ENUM_UART_STAT_ADDR_HI |
ENUM_UART_STAT_CTS_HI_STKY;
//清除所有与中断有关的状态 Mask Clear.
*pREG_UART0_IMSK_CLR=0x3FF;
//使能rxtx中断
*pREG_UART0_IMSK_SET=BITM_UART_IMSK_ERBFI|
BITM_UART_IMSK_ERFCI| //ENUM_UART_ERFCI_HI:如果设置了这个寄存器,那接收到7字节时会进入状态中断
BITM_UART_IMSK_ERXS | //使能接收中断,这是在没有DMA的情况下会重定位到状态中断中
BITM_UART_IMSK_ETBEI|
BITM_UART_IMSK_ETXS | //使能ETXS,重定位到发送状态中断,这是在没有DMA的情况
BITM_UART_IMSK_ELSI; //不使用DMA通道只使用中断模式。使能中断
/*control register:
*初始化uart的串口性质:停止位,校验位,位宽
* */
*pREG_UART0_CTL=ENUM_UART_CTL_UART_MODE | // uart模式
ENUM_UART_CTL_WL8BITS | //8字长
ENUM_UART_CTL_PARITY_DIS | //无奇偶
ENUM_UART_CTL_NO_EXTRA_STB| //1停止
ENUM_UART_CTL_RX_IRQ_TH7 | //能接收7个字节或者更多
// ENUM_UART_CTL_RPOLC_HI| //触发:下降沿开始接收,The polarity of received d
BITM_UART_CTL_EN; //使能uart
adi_sec_EnableSource(INTR_UART0_STAT,true);
adi_sec_SetPriority(INTR_UART0_STAT,0); //优先级最高
adi_sec_Enable(true);
adi_int_InstallHandler(INTR_UART0_STAT,UARTStatusHandler,buffer,true);
}
上面也有注释,对于寄存器更多的了解和uart编程模型,参照文档,还有就是CCES里面有例子可以参考,有时候蛮有用的。
下面是中断回调函数UARTStatusHandler的代码:
void UARTStatusHandler(uint32_t SID, void *pCBParam)
{
if(((*pREG_UART0_STAT & BITM_UART_STAT_THRE)!=0)&&((*pREG_UART0_STAT & BITM_UART_STAT_DR)==0)) //如果是发送状态至1,只判断这个标志不行,当DR=1时,它也为1
{
TransmitData(tx_data,12);
}
if((*pREG_UART0_STAT & BITM_UART_STAT_DR)!=0)
{
CollectRxData(rx_data,1); //sizeof(rx_data)/sizeof(rx_data[0])
}
else if(*pREG_UART0_STAT & BITM_UART_STAT_OE)
{
*pREG_UART0_STAT&=(~BITM_UART_STAT_OE);
}
/*可以设置出现错误的时候,清除帧,*/
else
{
// *pREG_UART0_STAT&=((~BITM_UART_STAT_OE)&(~ENUM_UART_STAT_PARITY_ERR)&(~ENUM_UART_STAT_FRAMING_ERR)&(~ENUM_UART_STAT_BREAK_INT));
}
}
uint8_t RnIndex=0;
void CollectRxData(uint8_t *buffer,uint32_t nBufSize)
{
/* When there is room to fill */
if(RnIndex < nBufSize)
{
/* Read the data from the UART Receive Buffer Register */
buffer[RnIndex++] = *pREG_UART0_RBR; //将RBR里的数据接收数据到buffer: pBuffer
/* Check if buffer is filled out */
if(RnIndex == nBufSize) //接收完成
{
RnIndex=0;
//清除状态
*pREG_UART0_STAT=ENUM_UART_STAT_OVR_ERR|
ENUM_UART_STAT_PARITY_ERR|
ENUM_UART_STAT_FRAMING_ERR|
ENUM_UART_STAT_BREAK_INT|
ENUM_UART_STAT_ADDR_HI_STKY|
ENUM_UART_STAT_ADDR_HI|
ENUM_UART_STAT_CTS_HI_STKY;
}
}
}
//发送OK
uint8_t TnIndex=0;
void TransmitData(uint8_t *buffer,uint32_t nBufSize)
{
if(TnIndex <= nBufSize)
{
*pREG_UART0_THR=buffer[TnIndex++];
if(TnIndex==nBufSize)
{
TnIndex=0;
// while( !(*pREG_UART0_STAT&BITM_UART_STAT_TEMT)); //如果传输完成
*pREG_UART0_IMSK_CLR|=BITM_UART_IMSK_CLR_ETBEI; //清除发送中断
}
}
}
上面程序是测试过的,当时配置的时候遇到的都是文档上可以解决的问题,多测试,可以在debug模式下配合CCES–window–show view–register观察配置的寄存器值的变化。
以上就是串口中断模式的配置,根据自个儿的需要编写函数体里面的内容。
上次说写uart的中断模式,今天才开始写,主要是把我之前通过测试的配置注在这里,开发的时候会比较多使用DMA模式,中断模式配置相对也比之复杂一些。
1、初始化配置:
void InitCoreUartx(uint8_t* buffer) //Uartx uartx,
{
uint32_t temp_reg = 0, ClkDivide_1 = 0;
uint32_t fcclk = 0u;
uint32_t fsysclk = 0u;
uint32_t fsclk0 = 0u;
uint32_t fsclk1 = 0u;
uint32_t coreclk;
uint32_t systemclk;
adi_pwr_GetCoreFreq(DEV_NUM, &fcclk);
adi_pwr_GetSystemFreq(DEV_NUM, &fsysclk, &fsclk0, &fsclk1);
//配置串口波特率
ClkDivide_1 = (uint32_t) ( ((float)fsclk0 / ((float)BAUD_RATE)));
*pREG_UART0_CLK = (ENUM_UART_CLK_EN_DIV_BY_ONE|(ClkDivide_1));
//W1C清除标志
*pREG_UART0_STAT=ENUM_UART_STAT_OVR_ERR |
ENUM_UART_STAT_PARITY_ERR |
ENUM_UART_STAT_FRAMING_ERR |
ENUM_UART_STAT_BREAK_INT |
ENUM_UART_STAT_ADDR_HI_STKY |
ENUM_UART_STAT_ADDR_HI |
ENUM_UART_STAT_CTS_HI_STKY;
//清除所有与中断有关的状态 Mask Clear.
*pREG_UART0_IMSK_CLR=0x3FF;
//使能rxtx中断
*pREG_UART0_IMSK_SET=BITM_UART_IMSK_ERBFI|
BITM_UART_IMSK_ERFCI| //ENUM_UART_ERFCI_HI:如果设置了这个寄存器,那接收到7字节时会进入状态中断
BITM_UART_IMSK_ERXS | //使能接收中断,这是在没有DMA的情况下会重定位到状态中断中
BITM_UART_IMSK_ETBEI|
BITM_UART_IMSK_ETXS | //使能ETXS,重定位到发送状态中断,这是在没有DMA的情况
BITM_UART_IMSK_ELSI; //不使用DMA通道只使用中断模式。使能中断
/*control register:
*初始化uart的串口性质:停止位,校验位,位宽
* */
*pREG_UART0_CTL=ENUM_UART_CTL_UART_MODE | // uart模式
ENUM_UART_CTL_WL8BITS | //8字长
ENUM_UART_CTL_PARITY_DIS | //无奇偶
ENUM_UART_CTL_NO_EXTRA_STB| //1停止
ENUM_UART_CTL_RX_IRQ_TH7 | //能接收7个字节或者更多
// ENUM_UART_CTL_RPOLC_HI| //触发:下降沿开始接收,The polarity of received d
BITM_UART_CTL_EN; //使能uart
adi_sec_EnableSource(INTR_UART0_STAT,true);
adi_sec_SetPriority(INTR_UART0_STAT,0); //优先级最高
adi_sec_Enable(true);
adi_int_InstallHandler(INTR_UART0_STAT,UARTStatusHandler,buffer,true);
}
上面也有注释,对于寄存器更多的了解和uart编程模型,参照文档,还有就是CCES里面有例子可以参考,有时候蛮有用的。
下面是中断回调函数UARTStatusHandler的代码:
void UARTStatusHandler(uint32_t SID, void *pCBParam)
{
if(((*pREG_UART0_STAT & BITM_UART_STAT_THRE)!=0)&&((*pREG_UART0_STAT & BITM_UART_STAT_DR)==0)) //如果是发送状态至1,只判断这个标志不行,当DR=1时,它也为1
{
TransmitData(tx_data,12);
}
if((*pREG_UART0_STAT & BITM_UART_STAT_DR)!=0)
{
CollectRxData(rx_data,1); //sizeof(rx_data)/sizeof(rx_data[0])
}
else if(*pREG_UART0_STAT & BITM_UART_STAT_OE)
{
*pREG_UART0_STAT&=(~BITM_UART_STAT_OE);
}
/*可以设置出现错误的时候,清除帧,*/
else
{
// *pREG_UART0_STAT&=((~BITM_UART_STAT_OE)&(~ENUM_UART_STAT_PARITY_ERR)&(~ENUM_UART_STAT_FRAMING_ERR)&(~ENUM_UART_STAT_BREAK_INT));
}
}
uint8_t RnIndex=0;
void CollectRxData(uint8_t *buffer,uint32_t nBufSize)
{
/* When there is room to fill */
if(RnIndex < nBufSize)
{
/* Read the data from the UART Receive Buffer Register */
buffer[RnIndex++] = *pREG_UART0_RBR; //将RBR里的数据接收数据到buffer: pBuffer
/* Check if buffer is filled out */
if(RnIndex == nBufSize) //接收完成
{
RnIndex=0;
//清除状态
*pREG_UART0_STAT=ENUM_UART_STAT_OVR_ERR|
ENUM_UART_STAT_PARITY_ERR|
ENUM_UART_STAT_FRAMING_ERR|
ENUM_UART_STAT_BREAK_INT|
ENUM_UART_STAT_ADDR_HI_STKY|
ENUM_UART_STAT_ADDR_HI|
ENUM_UART_STAT_CTS_HI_STKY;
}
}
}
//发送OK
uint8_t TnIndex=0;
void TransmitData(uint8_t *buffer,uint32_t nBufSize)
{
if(TnIndex <= nBufSize)
{
*pREG_UART0_THR=buffer[TnIndex++];
if(TnIndex==nBufSize)
{
TnIndex=0;
// while( !(*pREG_UART0_STAT&BITM_UART_STAT_TEMT)); //如果传输完成
*pREG_UART0_IMSK_CLR|=BITM_UART_IMSK_CLR_ETBEI; //清除发送中断
}
}
}
上面程序是测试过的,当时配置的时候遇到的都是文档上可以解决的问题,多测试,可以在debug模式下配合CCES–window–show view–register观察配置的寄存器值的变化。
以上就是串口中断模式的配置,根据自个儿的需要编写函数体里面的内容。
举报