单片机学习小组
直播中

王兰

14年用户 943经验值
擅长:基础元器件
私信 关注

ADSP-BF706UART中断模式的配置过程是怎样的?

ADSP-BF706UART中断模式的配置过程是怎样的?

回帖(1)

李亮

2022-2-7 10:39:53
上次说写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观察配置的寄存器值的变化。


以上就是串口中断模式的配置,根据自个儿的需要编写函数体里面的内容。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分