完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
刚开始接触新唐的单片机,项目上要用到6个串口,串口0/1的中断接收和发送配置都没问题,但是配置串口2/3/4/5却驱动不起来,数据发送不出,请教一下各位有经验的,我是不是哪里没注意?顺便求一份NUC131LC2AE的寄存器手册说明
void uart_init(UART_NO uart_no,uint32_t bound, uint32_t WordLength, uint32_t parity, uint32_t stop_bits) { switch(uart_no) { case UART_0: CLK_EnableModuleClock(UART0_MODULE);//使能串口时钟 CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));//选择串口时钟源 //设置串口接收、发送引脚 SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB0_Msk | SYS_GPB_MFP_PB1_Msk); SYS->GPB_MFP |= SYS_GPB_MFP_PB0_UART0_RXD | SYS_GPB_MFP_PB1_UART0_TXD; //复位串口 SYS_ResetModule(UART0_RST); UART_Open(UART0, bound);//默认8个数据长度,无奇偶校验,1个停止位 UART_SetLine_Config(UART0,bound,WordLength,parity,stop_bits);//配置串口 //配置串口接收模式 UART0->FCR|=0X3<<4; //配置fifo中断等级为14字节 UART_SettimeoutCnt(UART0, 40);//设置接收超时时间为40,单位波特率 /*使能接收FIFO 阀值中断,和接收超时中断*/ UART_ENABLE_INT(UART0, (UART_IER_RDA_IEN_Msk | UART_IER_TOUT_IEN_Msk)); NVIC_EnableIRQ(UART02_IRQn); break; case UART_1: CLK_EnableModuleClock(UART1_MODULE);//使能串口时钟 CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));//选择串口时钟源 //设置串口接收、发送引脚 SYS->GPB_MFP &= ~(SYS_GPB_MFP_PB4_Msk | SYS_GPB_MFP_PB5_Msk); SYS->GPB_MFP |= SYS_GPB_MFP_PB4_UART1_RXD | SYS_GPB_MFP_PB5_UART1_TXD; //复位串口 SYS_ResetModule(UART1_RST); UART_Open(UART1, bound);//默认8个数据长度,无奇偶校验,1个停止位 UART_SetLine_Config(UART1,bound,WordLength,parity,stop_bits);//配置串口 //配置串口接收模式 UART1->FCR|=0X3<<4; //配置fifo中断等级为14字节 UART_SetTimeoutCnt(UART1, 40);//设置接收超时时间为40,单位波特率 /*使能接收FIFO 阀值中断,和接收超时中断*/ UART_ENABLE_INT(UART1, (UART_IER_RDA_IEN_Msk | UART_IER_TOUT_IEN_Msk)); NVIC_EnableIRQ(UART1_IRQn); break; case UART_2: CLK_EnableModuleClock(UART2_MODULE);//使能串口时钟 CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));//选择串口时钟源 //设置串口接收、发送引脚 SYS->GPB_MFP &= ~(SYS_GPD_MFP_PD14_Msk | SYS_GPD_MFP_PD15_Msk); SYS->GPB_MFP |= SYS_GPD_MFP_PD14_UART2_RXD | SYS_GPD_MFP_PD15_UART2_TXD; //复位串口 SYS_ResetModule(UART2_RST); UART_Open(UART2, bound);//默认8个数据长度,无奇偶校验,1个停止位 UART_SetLine_Config(UART2,bound,WordLength,parity,stop_bits);//配置串口 //配置串口接收模式 UART2->FCR|=0X3<<4; //配置fifo中断等级为14字节 UART_SetTimeoutCnt(UART2, 40);//设置接收超时时间为40,单位波特率 /*使能接收FIFO 阀值中断,和接收超时中断*/ UART_ENABLE_INT(UART2, (UART_IER_RDA_IEN_Msk | UART_IER_TOUT_IEN_Msk)); break; case UART_3: CLK_EnableModuleClock(UART3_MODULE);//使能串口时钟 CLK_SetModuleClock(UART3_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));//选择串口时钟源 //设置串口接收、发送引脚 SYS->GPB_MFP &= ~(SYS_GPA_MFP_PA3_Msk | SYS_GPA_MFP_PA2_Msk); SYS->GPB_MFP |= SYS_GPA_MFP_PA3_UART3_RXD | SYS_GPA_MFP_PA2_UART3_TXD; //复位串口 SYS_ResetModule(UART3_RST); UART_Open(UART3, bound);//默认8个数据长度,无奇偶校验,1个停止位 UART_SetLine_Config(UART3,bound,WordLength,parity,stop_bits);//配置串口 //配置串口接收中断 UART_ENABLE_INT(UART3, UART_IER_RDA_IEN_Msk); NVIC_EnableIRQ(UART3_IRQn); break; case UART_4: CLK_EnableModuleClock(UART4_MODULE);//使能串口时钟 CLK_SetModuleClock(UART4_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));//选择串口时钟源 //设置串口接收、发送引脚 SYS->GPB_MFP &= ~(SYS_GPC_MFP_PC7_Msk | SYS_GPC_MFP_PC6_Msk); SYS->GPB_MFP |= SYS_GPC_MFP_PC7_UART4_RXD | SYS_GPC_MFP_PC6_UART4_TXD; //复位串口 SYS_ResetModule(UART4_RST); UART_Open(UART4, bound);//默认8个数据长度,无奇偶校验,1个停止位 UART_SetLine_Config(UART4,bound,WordLength,parity,stop_bits);//配置串口 //配置串口接收中断 UART_ENABLE_INT(UART4, UART_IER_RDA_IEN_Msk); NVIC_EnableIRQ(UART4_IRQn); break; case UART_5: CLK_EnableModuleClock(UART5_MODULE);//使能串口时钟 CLK_SetModuleClock(UART5_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));//选择串口时钟源 //设置串口接收、发送引脚 SYS->GPB_MFP &= ~(SYS_GPA_MFP_PA1_Msk | SYS_GPA_MFP_PA0_Msk); SYS->GPB_MFP |= SYS_GPA_MFP_PA1_UART5_RXD | SYS_GPA_MFP_PA0_UART5_TXD; //复位串口 SYS_ResetModule(UART5_RST); UART_Open(UART5, bound);//默认8个数据长度,无奇偶校验,1个停止位 UART_SetLine_Config(UART5,bound,WordLength,parity,stop_bits);//配置串口 //配置串口接收中断 UART_ENABLE_INT(UART5, UART_IER_RDA_IEN_Msk); NVIC_EnableIRQ(UART5_IRQn); break; case UART_6: break; case UART_7: break; default: break; } } |
|
相关推荐
1个回答
|
|
首先需要确认串口2/3/4/5的引脚配置是否正确,包括RX和TX引脚是否正确连接,是否开启了对应引脚的GPIO时钟和复用功能。
其次,需要确认串口的时钟源是否正确配置,以及是否开启了对应串口的时钟。 最后,需要检查串口初始化函数中参数的设置是否正确,特别是波特率、数据位、校验位和停止位的设置是否符合要求。 关于NUC131LC2AE的寄存器手册,可以在新唐官网上下载相关文档进行参考。 下面是一个简单的串口初始化函数示例: void uart_init(UART_NO uart_no, uint32_t baud_rate, uint32_t data_bits, uint32_t parity, uint32_t stop_bits) { uint32_t div; switch(uart_no) { case UART0: CLK_EnableModuleClock(UART0_MODULE); //使能UART0模块时钟 CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_PCLK0, CLK_CLKDIV_UART(1)); //设置UART0时钟源和分频 SYS_ResetModule(UART0_RST); //复位UART0模块 break; case UART1: //配置UART1时钟和复位 break; case UART2: //配置UART2时钟和复位 break; case UART3: //配置UART3时钟和复位 break; case UART4: //配置UART4时钟和复位 break; case UART5: //配置UART5时钟和复位 break; } //计算波特率分频值 div = (uint32_t)(((float)UART_CLK_FREQ / (baud_rate * data_bits * (parity + 1) * stop_bits)) + 0.5f) - 1; //配置波特率、数据位、校验位和停止位 UART_Open(uart_no, baud_rate, (UART_WORD_LEN)data_bits, (UART_PARITY)parity, (UART_STOP_BIT)stop_bits); //设置波特率分频寄存器 UART_SetBaud(uart_no, div); //开启UART中断 UART_ENABLE_INT(uart_no, (UART_IER_RDA_IEN_Msk | UART_IER_RTO_IEN_Msk)); //使能UART接收器 UART_EnableInt(uart_no, (UART_IER_RDA_IEN_Msk | UART_IER_RTO_IEN_Msk)); } |
|
1 条评论
|
|
只有小组成员才能发言,加入小组>>
3130 浏览 9 评论
2827 浏览 16 评论
3337 浏览 1 评论
8708 浏览 16 评论
3930 浏览 18 评论
9549浏览 3评论
886浏览 3评论
458浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
458浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2178浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-20 02:26 , Processed in 0.660610 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号