TA的每日心情 | 无聊 2014-12-25 15:47 |
---|
签到天数: 6 天 连续签到: 1 天 [LV.2]偶尔看看I
|
折腾了好久才将一个简单的串口发送程序搞定,期间遇到各种莫名其妙的问题,总结一下,供大家参考:
因为本人的开发环境是自己搭好的,具体参见
https://www.cirmall.com/bbs/thread-6725-1-1.html
遇到问题只能自己琢磨,好在终于解决了。
问题一:串口没有输出,对比官方的例程,初始化是一样的,百思不得其解,后来终于在PMC里观察到UART0没有使能!
void UartInit()
{
Pin UartPinsInitStruct;
UartPinsInitStruct.mask=PIO_PA9|PIO_PA10;
UartPinsInitStruct.pio=PIOA;
UartPinsInitStruct.id=ID_PIOA;
UartPinsInitStruct.type=PIO_PERIPH_A;
UartPinsInitStruct.attribute=PIO_DEFAULT;
PIO_Configure(&UartPinsInitStruct,1);
PIO_DisableWriteProtect(&UartPinsInitStruct);
PMC_EnablePeripheral(ID_UART0); //串口时钟使能
UART0->UART_CR = UART_CR_RSTRX|UART_CR_RSTTX
|UART_CR_RXDIS|UART_CR_TXDIS;
UART0->UART_MR=UART_MR_PAR_NO; //无校验
UART0->UART_BRGR=100000000/(16*115200); //波特率设定为115200
UART0->UART_PTCR = UART_PTCR_RXTDIS|UART_PTCR_TXTDIS;
UART0->UART_CR|=UART_CR_TXEN; //发送使能
}
原因是PMC->WPMR写保护,必须把这个写保护关掉,关掉方法如下:
void PmcDisableWP(void)
{
unsigned key=0x504D43<<8;
if(PMC->PMC_WPMR&1==1)
PMC->PMC_WPMR=key;
else
return;
}
问题二,波特率不对,导致乱码,这个比较简单,因为是移植MDK下的时钟初始化函数,想当然认为是120M的主频,后来用
systick定时器测试了一下,确定是100M,
波特率的计算公式为:MCK/(16*波特率)
UART0->UART_BRGR=100000000/(16*115200);
问题解决了,显摆下我的效果;
完整工程见附件,里面也两个工程文件,带串口字样的是本工程
|
|