[LKS32 硬件] LKS32MC081评测 + systick的使用

[复制链接]
 楼主| tlled 发表于 2022-6-19 17:25 | 显示全部楼层 |阅读模式
    了解开发板硬件和例程后,来学习和测试下板卡滴答定时器,使用滴答定时器来做延时程序,通过LED指示灯来看运行情况。

    一、硬件电路

    开发板上有3路LED指示灯,LED电路图如下
    001.png

    对应核心板的驱动端口是P0.6、P0.7和P0.3。
    002.png

    二、程序部分

    在编写测试程序之前,先来了解下LKS32MC08x的时钟部分。

    2.1、主时钟
    主时钟是内部的4MHzRC电路经PLL后产生96MHz的主频,在经过n/8分频后,得到MCLK时钟,也就是外设需要的始终。下面是时钟框图。
    003.png

    程序中有关时钟配置的程序,配置主频输出96MHz。
    005.png

    2.2、systick定时器

    手册上有关systick定时器介绍,它使用主时钟做信号输入源。
    004.png

    2.3、delay.c
    使用systick定时器延时函数
  1. #include "delay.h"
  2. #include "lks32mc08x.h"

  3. static u8  fac_us=0;                                                                  
  4. static u16 fac_ms=0;                                                       
  5.        
  6. void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
  7. {
  8.   if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  9.   {
  10.     SysTick->CTRL |= SysTick_CLKSource_HCLK;
  11.   }
  12.   else
  13.   {
  14.     SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  15.   }
  16. }
  17.    
  18. void delay_init(void)
  19. {
  20.         uint32_t SystemCoreClock         = SYSCLK_FREQ_96MHz;
  21.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);       
  22.         fac_us=SystemCoreClock/8000000;                                  
  23.         fac_ms=(u16)fac_us*1000;                                       
  24. }                                                                    

  25. void delay_us(u32 nus)
  26. {               
  27.         u32 temp;                     
  28.         SysTick->LOAD=nus*fac_us;                                                            
  29.         SysTick->VAL=0x00;                                               
  30.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          
  31.         do
  32.         {
  33.                 temp=SysTick->CTRL;
  34.         }while((temp&0x01)&&!(temp&(1<<16)));                 
  35.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       
  36.         SysTick->VAL =0X00;                                               
  37. }

  38. void delay_ms(u16 nms)
  39. {                                     
  40.         u32 temp;                  
  41.         SysTick->LOAD=(u32)nms*fac_ms;                               
  42.         SysTick->VAL =0x00;                                                       
  43.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;         
  44.         do
  45.         {
  46.                 temp=SysTick->CTRL;
  47.         }while((temp&0x01)&&!(temp&(1<<16)));                  
  48.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       
  49.         SysTick->VAL =0X00;                                                             
  50. }


    2.4、led.c   
  1. #include "hardware_config.h"

  2. void init_led(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStruct;
  5.         GPIO_StructInit(&GPIO_InitStruct);  
  6.         //ÅäÖÃLED1£ºP0.6
  7.         GPIO_StructInit(&GPIO_InitStruct);         //³õʼ»¯½á¹¹Ìå
  8.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIOÊä³öģʽ
  9.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  10.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  11.         GPIO_Init(GPIO0, &GPIO_InitStruct);

  12.         //ÅäÖÃLED2£ºP0.7
  13.         GPIO_StructInit(&GPIO_InitStruct);         //³õʼ»¯½á¹¹Ìå
  14.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIOÊä³öģʽ
  15.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
  16.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  17.         GPIO_Init(GPIO0, &GPIO_InitStruct);

  18.         //ÅäÖÃLED3: P0.3
  19.         GPIO_StructInit(&GPIO_InitStruct);         //³õʼ»¯½á¹¹Ìå
  20.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIOÊä³öģʽ
  21.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
  22.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  23.         GPIO_Init(GPIO0, &GPIO_InitStruct);
  24. }

    2.5、led.h

  1. #ifndef __LED_H__
  2. #define __LED_H__

  3. #define led1_on()                GPIO_SetBits(GPIO0, GPIO_Pin_6)
  4. #define led1_off()         GPIO_ResetBits(GPIO0, GPIO_Pin_6)

  5. #define led2_on()                GPIO_SetBits(GPIO0, GPIO_Pin_7)
  6. #define led2_off()        GPIO_ResetBits(GPIO0, GPIO_Pin_7)

  7. #define led3_on()                GPIO_ResetBits(GPIO0, GPIO_Pin_3)
  8. #define led3_off()        GPIO_SetBits(GPIO0, GPIO_Pin_3)

  9. void init_led(void);


  10. #endif


    2.6、main.c

  1. *******************************************************************************/
  2. int main(void)
  3. {
  4.         u8 key = 0;
  5.         Hardware_init();   /* Ó²¼þ³õʼ»¯*/
  6.        
  7.         delay_init();
  8.         init_led();
  9.        
  10.         while (1)
  11.         {
  12.                 led1_on();
  13.                 led2_off();
  14.                 led3_on();
  15.                 delay_ms(100);
  16.                 led1_off();
  17.                 led2_on();
  18.                 led3_off();
  19.                 delay_ms(100);
  20.         }
  21. }

     三、程序运行

   LED灯交替闪烁
    100.gif



match007 发表于 2022-6-22 21:13 | 显示全部楼层
感觉LED1和2这样接不好,为什么不统一成3那样
夜声 发表于 2022-6-22 21:56 | 显示全部楼层
库是自己又从新封装了吗
我喜欢打游戏 发表于 2022-6-23 16:37 | 显示全部楼层
有测试精准度吗
 楼主| tlled 发表于 2022-6-23 17:06 | 显示全部楼层
夜声 发表于 2022-6-22 21:56
库是自己又从新封装了吗

还是官网资料的库
 楼主| tlled 发表于 2022-6-23 17:12 | 显示全部楼层

测试了,可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部