在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
LPC860-MAX 收到2周了,一直没空弄。今天抽空把DEMO程序写出来。
板子上资源极简LED,KEY,USART及下载调试电路。但是这芯片本身应用的场合就是这种小应用场合,也倒符合。
先通过,MCUXPRESS 导出一个最间的Hello world 程序。然后通过MCUXPRESS创建一个基于LPC865芯片的例程。
配置时钟及各种外设(SWD/LED/KEY/USART),将USART设置为INTERRUPT模式,并使能RX接收中断,更新配置
代码工具上的更新源码后,生成一个board文件夹,里面有clock_config,pin_mux,peripherals三个文件。这就是
我们通过配置工具配置的文件。
然后在主函数里面调用就可以了。
这里面我们创建基于systick的延时函数:
- #include "delay.h"
- static u8 fac_us=0; //us延时倍乘数
- static u16 fac_ms=0;
- //当前配置sysclock时钟为30M
- void delay_init(u32 systemclock)
- {
- fac_us=systemclock/1000000; //系统时钟的为15M,15cnt=1us
- fac_ms=(uint16_t)fac_us*1000; //每个ms需要的systick时钟数
- }
- //延时nus
- //nus为要延时的us数.
- void delay_us(uint32_t nus)
- {
- u32 temp;
- SysTick->LOAD=nus*fac_us; //时间加载
- SysTick->VAL=0x00; //清空计数器
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
- do
- {
- temp=SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
- SysTick->VAL =0X00; //清空计数器
- }
- //延时nms
- //注意nms的范围
- //SysTick->LOAD为24位寄存器,所以,最大延时为:
- //nms<=0xffffff*8*1000/SYSCLK
- //SYSCLK单位为Hz,nms单位为ms
- //对15M条件下,nms<=8947
- void delay_ms(u16 nms)
- {
- u32 temp;
- SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
- SysTick->VAL =0x00; //清空计数器
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
- do
- {
- temp=SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
- SysTick->VAL =0X00; //清空计数器
- }
复制代码 使用usart0来作为printf的调试工具,函数如下:
- #include "usart0_debug.h"
- //////////////////////////////////////////////////////////////////
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- #if 1
- //#pragma import(__use_no_semihosting)
- ////标准库需要的支持函数
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- while((USART0->STAT & USART_STAT_TXRDY_MASK)==0){};//循环发送,直到发送完毕
- USART0->TXDAT = (u8) ch;
- return ch;
- }
- #endif
-
- #if EN_USART0_RX //如果使能了接收
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 USART0_RX_BUF[USART0_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART0_RX_STA=0; //接收状态标记
- void usart0_debug_Init(uint32_t bound)
- {
- const usart_config_t USART0_config = {
- .baudRate_Bps = bound,
- .syncMode = kUSART_SyncModeDisabled,
- .parityMode = kUSART_ParityDisabled,
- .stopBitCount = kUSART_OneStopBit,
- .bitCountPerChar = kUSART_8BitsPerChar,
- .loopback = false,
- .enableRx = true,
- .enableTx = true,
- .rxIdleTimeout = 0,
- .clockPolarity = kUSART_RxSampleOnFallingEdge,
- .enableContinuousSCLK = false,
- .enableHardwareFlowControl = false
- };
- /* Select the main clock as source clock of USART0 (debug console) */
- CLOCK_Select(kUART0_Clk_From_MainClk);
- /* USART0 peripheral initialization */
- RESET_PeripheralReset(kUART0_RST_N_SHIFT_RSTn);
- USART_Init(USART0_PERIPHERAL, &USART0_config, CLOCK_GetMainClkFreq());
-
- USART_EnableInterrupts(USART0_PERIPHERAL, kUSART_RxReadyInterruptEnable);
- /* Enable interrupt USART0_IRQn request in the NVIC. */
- EnableIRQ(USART0_IRQn);
- }
- //中断函数
- void USART0_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res;
- uint32_t status;
- status = USART0->STAT;
- if((status & USART_STAT_RXRDY_MASK) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- Res =USART_ReadByte(USART0); //读取接收到的数据
- if((USART0_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART0_RX_STA&0x4000)//接收到了0x0d
- {
- if(Res!=0x0a)USART0_RX_STA=0;//接收错误,重新开始
- else USART0_RX_STA|=0x8000; //接收完成了
- }
- else //还没收到0X0D
- {
- if(Res==0x0d)USART0_RX_STA|=0x4000;
- else
- {
- USART0_RX_BUF[USART0_RX_STA&0X3FFF]=Res ;
- USART0_RX_STA++;
- if(USART0_RX_STA>(USART0_REC_LEN-1))USART0_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- }
- USART_ClearStatusFlags(USART0,status);
- }
- #endif
复制代码 然后在Main函数里面调用即可:
- int main(void)
- {
- u16 t;
- u16 len,times;
- /* Init board hardware. */
- BOARD_InitBootPins();
- BOARD_InitBootClocks();
- BOARD_InitBootPeripherals();
- delay_init(30000000);//当前设定频率为30M
- usart0_debug_Init(9600);
- LED_Init();
- printf("The MainClock is %d MHz.\r\n",SystemCoreClock/1000000);
-
- while (1)
- {
- if(USART0_RX_STA&0x8000)
- {
- len=USART0_RX_STA&0x3fff;//得到此次接收到的数据长度
- printf("\r\nYou Send message is:\r\n");
- for(t=0;t<len;t++)
- {
- while((USART0->STAT & USART_STAT_TXRDY_MASK)==RESET){};//循环发送,直到发送完毕
- USART0->TXDAT = (u8) USART0_RX_BUF[t];
- }
- printf("\r\n\r\n");//插入换行
- USART0_RX_STA=0;
- }
- else
- {
- times++;
- if(times%500==0)
- {
- printf("\r\nLPC865_MAX_BOARD\r\n");
- printf("JacksonQiu@NXP \r\n\r\n\r\n");
- }
- if(times%20==0)printf("Please put your words,then enter the enter_key!\r\n");
- if(times%30==0)GREEN_LED_TOGGLE();//闪烁LED,提示系统正在运行.
- delay_ms(10);
- }
- }
- }
复制代码 这样一个闪烁LED并打印输入字符的程序就好了。
Code:
LPC865_CodeDemo.rar
(592.36 KB, 下载次数: 2)
|
|