本帖最后由 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;
}
|