查看: 193|回复: 1

[分享] 【LPC860-max板卡试用】1.创建自己的程序模板

[复制链接]
  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2023-11-30 20:10:40 | 显示全部楼层 |阅读模式
    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三个文件。这就是
    我们通过配置工具配置的文件。
    微信截图_20231130200935.png
    然后在主函数里面调用就可以了。
    这里面我们创建基于systick的延时函数:
    1. #include "delay.h"

    2. static u8  fac_us=0;                                                        //us延时倍乘数                          
    3. static u16 fac_ms=0;

    4. //当前配置sysclock时钟为30M
    5. void delay_init(u32 systemclock)
    6. {
    7.     fac_us=systemclock/1000000;                                //系统时钟的为15M,15cnt=1us
    8.     fac_ms=(uint16_t)fac_us*1000;                                        //每个ms需要的systick时钟数  
    9. }

    10. //延时nus
    11. //nus为要延时的us数.                                                                                      
    12. void delay_us(uint32_t nus)
    13. {               
    14.         u32 temp;                     
    15.         SysTick->LOAD=nus*fac_us;                                         //时间加载                           
    16.         SysTick->VAL=0x00;                                                //清空计数器
    17.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数          
    18.         do
    19.         {
    20.                 temp=SysTick->CTRL;
    21.         }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
    22.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
    23.         SysTick->VAL =0X00;                                               //清空计数器         
    24. }
    25. //延时nms
    26. //注意nms的范围
    27. //SysTick->LOAD为24位寄存器,所以,最大延时为:
    28. //nms<=0xffffff*8*1000/SYSCLK
    29. //SYSCLK单位为Hz,nms单位为ms
    30. //对15M条件下,nms<=8947
    31. void delay_ms(u16 nms)
    32. {                                     
    33.         u32 temp;                  
    34.         SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
    35.         SysTick->VAL =0x00;                                                        //清空计数器
    36.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数  
    37.         do
    38.         {
    39.                 temp=SysTick->CTRL;
    40.         }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
    41.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
    42.         SysTick->VAL =0X00;                                               //清空计数器                      
    43. }
    复制代码
    使用usart0来作为printf的调试工具,函数如下:
    1. #include "usart0_debug.h"

    2. //////////////////////////////////////////////////////////////////
    3. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
    4. #if 1
    5. //#pragma import(__use_no_semihosting)            
    6. ////标准库需要的支持函数                 
    7. FILE __stdout;      
    8. //定义_sys_exit()以避免使用半主机模式   
    9. void _sys_exit(int x)
    10. {
    11.         x = x;
    12. }
    13. //重定义fputc函数
    14. int fputc(int ch, FILE *f)
    15. {      
    16.         while((USART0->STAT & USART_STAT_TXRDY_MASK)==0){};//循环发送,直到发送完毕   
    17.   USART0->TXDAT = (u8) ch;      
    18.         return ch;
    19. }
    20. #endif


    21. #if EN_USART0_RX   //如果使能了接收
    22. //串口1中断服务程序
    23. //注意,读取USARTx->SR能避免莫名其妙的错误          
    24. u8 USART0_RX_BUF[USART0_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
    25. //接收状态
    26. //bit15,        接收完成标志
    27. //bit14,        接收到0x0d
    28. //bit13~0,        接收到的有效字节数目
    29. u16 USART0_RX_STA=0;       //接收状态标记          

    30. void usart0_debug_Init(uint32_t bound)
    31. {

    32.   const usart_config_t USART0_config = {
    33.     .baudRate_Bps = bound,
    34.     .syncMode = kUSART_SyncModeDisabled,
    35.     .parityMode = kUSART_ParityDisabled,
    36.     .stopBitCount = kUSART_OneStopBit,
    37.     .bitCountPerChar = kUSART_8BitsPerChar,
    38.     .loopback = false,
    39.     .enableRx = true,
    40.     .enableTx = true,
    41.     .rxIdleTimeout = 0,
    42.     .clockPolarity = kUSART_RxSampleOnFallingEdge,
    43.     .enableContinuousSCLK = false,
    44.     .enableHardwareFlowControl = false
    45.   };

    46.   /* Select the main clock as source clock of USART0 (debug console) */
    47.   CLOCK_Select(kUART0_Clk_From_MainClk);
    48.   /* USART0 peripheral initialization */
    49.   RESET_PeripheralReset(kUART0_RST_N_SHIFT_RSTn);
    50.   USART_Init(USART0_PERIPHERAL, &USART0_config,  CLOCK_GetMainClkFreq());
    51.   
    52.   USART_EnableInterrupts(USART0_PERIPHERAL, kUSART_RxReadyInterruptEnable);
    53.   /* Enable interrupt USART0_IRQn request in the NVIC. */
    54.   EnableIRQ(USART0_IRQn);
    55. }

    56. //中断函数
    57. void USART0_IRQHandler(void)                        //串口1中断服务程序
    58. {
    59.   u8 Res;
    60.   uint32_t status;

    61.   status = USART0->STAT;

    62.   if((status & USART_STAT_RXRDY_MASK) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    63.   {
    64.     Res =USART_ReadByte(USART0);        //读取接收到的数据

    65.     if((USART0_RX_STA&0x8000)==0)//接收未完成
    66.     {
    67.       if(USART0_RX_STA&0x4000)//接收到了0x0d
    68.       {
    69.         if(Res!=0x0a)USART0_RX_STA=0;//接收错误,重新开始
    70.         else USART0_RX_STA|=0x8000;        //接收完成了
    71.       }
    72.       else //还没收到0X0D
    73.       {       
    74.         if(Res==0x0d)USART0_RX_STA|=0x4000;
    75.         else
    76.         {
    77.           USART0_RX_BUF[USART0_RX_STA&0X3FFF]=Res ;
    78.           USART0_RX_STA++;
    79.           if(USART0_RX_STA>(USART0_REC_LEN-1))USART0_RX_STA=0;//接收数据错误,重新开始接收          
    80.         }                 
    81.       }
    82.     }                    
    83.   }
    84.   USART_ClearStatusFlags(USART0,status);
    85. }
    86. #endif


    复制代码
    然后在Main函数里面调用即可:
    1. int main(void)
    2. {
    3.   u16 t;  
    4.   u16 len,times;       

    5.   /* Init board hardware. */
    6.   BOARD_InitBootPins();
    7.   BOARD_InitBootClocks();
    8.   BOARD_InitBootPeripherals();

    9.   delay_init(30000000);//当前设定频率为30M
    10.   usart0_debug_Init(9600);
    11.   LED_Init();
    12.   printf("The MainClock is %d MHz.\r\n",SystemCoreClock/1000000);
    13.   
    14.   while (1)
    15.   {
    16.     if(USART0_RX_STA&0x8000)
    17.     {
    18.       len=USART0_RX_STA&0x3fff;//得到此次接收到的数据长度
    19.       printf("\r\nYou Send message is:\r\n");
    20.       for(t=0;t<len;t++)
    21.       {
    22.         while((USART0->STAT & USART_STAT_TXRDY_MASK)==RESET){};//循环发送,直到发送完毕   
    23.         USART0->TXDAT = (u8) USART0_RX_BUF[t];  
    24.       }
    25.       printf("\r\n\r\n");//插入换行
    26.       USART0_RX_STA=0;
    27.     }
    28.     else
    29.     {
    30.       times++;
    31.       if(times%500==0)
    32.       {
    33.         printf("\r\nLPC865_MAX_BOARD\r\n");
    34.         printf("JacksonQiu@NXP \r\n\r\n\r\n");
    35.       }
    36.       if(times%20==0)printf("Please put your words,then enter the enter_key!\r\n");  
    37.       if(times%30==0)GREEN_LED_TOGGLE();//闪烁LED,提示系统正在运行.
    38.       delay_ms(10);
    39.     }
    40.   }
    41. }
    复制代码
    这样一个闪烁LED并打印输入字符的程序就好了。
    微信截图_20231130200803.png
    串口.png
    fb.gif
    Code:
    LPC865_CodeDemo.rar (592.36 KB, 下载次数: 2)
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2023-12-1 14:17:09 | 显示全部楼层
    搞一个自己的,这样以后用起来就方便了。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 17:02 , Processed in 0.104402 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表