打印
[技术问题解答]

我写的UART功能怎么实现不了,这是什么问题?(已解决)

[复制链接]
3247|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
870205766|  楼主 | 2014-5-9 11:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-6-3 16:24 编辑

根据UART编程手册和参考手册  我写的UART功能怎么实现不了,这是什么问题?

问题补充:
                  1.这是我在新建工程中,在Main里加入的代码
                  2.编译软件CW10.6   芯片KL25Z
   

#include "derivative.h"

int main(void)
{
        int counter = 0;
        //////////////////////////////////////////////////
        
        //////////////////////////////////////////////////
        
        unsigned char  msg[6]= "Hello";
        unsigned char  c;
        c=msg[6];
        
        #define POLLING_MODE 1                //两个宏已被定义为允许不同UART模式
        #define INTERRUPT_MODE 2
        
        //该UART操作模式将被选中下面的语句
        #define UART_MODE POLLING_MODE         //INTERRUPT_MODE               
        
        
        //1.SIM模块的配置
        SIM_SOPT2 |= SIM_SOPT2_UART0SRC(1);
        SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;
        SIM_SCGC4 = SIM_SCGC4_UART0_MASK;
        SIM_SCGC5 = SIM_SCGC5_PORTA_MASK;
        
        //2.所需的端口引脚必须配置和 初始化。
        PORTA_PCR2 = PORT_PCR_ISF_MASK|PORT_PCR_MUX(0x2);        //ISF 0未检测到配置的中断 | MUX 010方案2(芯片专用)。
        PORTA_PCR1 = PORT_PCR_ISF_MASK|PORT_PCR_MUX(0x2);
        
        //3.在UART模块初始化开始时,该模块之前,必须禁止改变设置。     使用UART控制寄存器2(UART0_C2)
        UART0_C2 &= ~ (UART0_C2_TE_MASK| UART0_C2_RE_MASK);
        
        
        //如之前提到的,它是必要的配置的嵌套向量中断控制器(NVIC)模块的UART0操作的
        //中断模式。这必须是只有当INTERRUPT_MODE定义编译。
#if UART_MODE == INTERRUPT_MODE
enable_irq(12); set_irq_priority(12, 3);
#endif

        //中断向量也必须重新定义中断服务程序的头文件中,isr.h指向相应的中断服务程序。
        extern void uart0_isr(void);
        #undef VECTOR_028
        #define VECTOR_028 uart0_isr
        
        
        //接下来的部分代表UART0模块配置。该模块可以被配置对于两种操作模式。波特率设置在程序的开始。
        //MCGFLLCLK = 48兆赫作为该模块的时钟源;过采样率16;波特115200
        
        //假设上述参数中,13位预分频因子可以计算 X=    4800 0000 /(115200*16)  =26
        //这将导致以下波特率寄存器设置。
        UART0_BDH = 0x00;
        UART0_BDL = 0x1A;
        UART0_C4 = 0x0F;
        
        

        
        //8位通信,无奇偶校验,一个停止位,LSB在前,没有反转的配置使用。
        //它也建议使模块,以避免前清除所有标志意外的行为。
        UART0_C1 = 0x00;
        UART0_C3 = 0x00;
        UART0_MA1 = 0x00;
        UART0_MA1 = 0x00;
        UART0_S1 |= 0x1F;
        UART0_S2 |= 0xC0;

        
        //如果使用中断模式操作时,接收中断,还必须启用。这个中断与UARTx_S1 [RDRF]关联。
#if UART_MODE == INTERRUPT_MODE
UART0_C2 = UART0_C2_RIE_MASK;
#endif
        
        //在配置结束时,接收器和发射器可以被激活。无需额外的是必需的配置。
        UART0_C2 |= UART0_C2_TE_MASK| UART0_C2_RE_MASK;
        
        //后UART0模块的初始化,所有中断被改变处理器启用状态指示。
        //asm(“CPSIE i”);
        
        while (1)
        {
                #if UART_MODE == POLLING_MODE
                while(!(UART0_S1&UART_S1_RDRF_MASK));
                c= UART0_D;
                while(!(UART0_S1&UART_S1_TDRE_MASK) && !(UART0_S1&UART_S1_TC_MASK));
                UART0_D = c;
                #endif
        }
        
        
        
        //当使用中断模式时,接收和发送数据的过程中进行的接收数据寄存器满中断服务程序。
#if UART_MODE == INTERRUPT_MODE
void uart0_isr(void)
{
        if (UART0_S1&UART_S1_RDRF_MASK)
        {
                c = UART0_D;
                if (!(UART0_S1&UART_S1_TDRE_MASK) && !(UART0_S1&UART_S1_TC_MASK))
                {
                        UART0_D = c;
                }
        }
}
#endif        
        

        //////////////////////////////////////////////////

        ///////////////////////////////////////////////        
        
        
        
        for(;;) {           
                   counter++;
        }
        
        return 0;
}

相关帖子

沙发
FSL_TICS_Jeremy| | 2014-5-9 15:58 | 只看该作者
你好,楼主!
能详细说明具体错误是什么吗?
不然不知道从哪里入手帮你解决问题啊!

使用特权

评论回复
板凳
870205766|  楼主 | 2014-5-10 09:14 | 只看该作者
编译,完全没有错误,就是用电脑串口猎人发字符给单片机,没有反应

使用特权

评论回复
地板
FSL_TICS_Jeremy| | 2014-5-12 11:05 | 只看该作者
试试从单片机发个字符给上位机,看看是正常显示,还是软码显示,
最好建议楼主使用示波器或者逻辑分析仪看看波形的表现如何。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

103

帖子

1

粉丝