完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
上次说写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观察配置的寄存器值的变化。 以上就是串口中断模式的配置,根据自个儿的需要编写函数体里面的内容。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:50 , Processed in 0.579564 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号