[CW32F030系列] 【CW32F030CxTx StartKit】2、点灯、时钟PLL到64MHZ、普通定时器

[复制链接]
1684|9
 楼主| freeelectron 发表于 2022-7-12 19:52 | 显示全部楼层 |阅读模式
CW32, ar, cw, hz
本帖最后由 freeelectron 于 2022-7-12 19:53 编辑

#申请原创#


1、前言:

官方的demo用的阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯。


2、硬件连接

led.png

3、思路

利用定时器中断,每1ms中断一次,整个系统维护一个tick计数;

记录某一时刻的tick,用A表示,再获取当前的tick,用B表示,如果当前的B-A大于等于500(这里500ms闪烁一次),那么就执行一次led翻转,同时也更新A的值。


4、软件实现

(1)利用定时器中断,每1ms中断一次,整个系统维护一个tick计数,本文使用基础定时器1

  1. static uint32_t SystemTick=0;

  2. void TimerConfig(void)
  3. {
  4.     RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM,ENABLE);

  5.         NVIC_EnableIRQ(BTIM1_IRQn);
  6.         
  7.         BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;//1000000
  8.         
  9.         BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;
  10.         BTIM_TimeBaseInitStruct.BTIM_Period = 999;
  11.         BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV64; //64分频

  12.         BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct);
  13.         BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);
  14.         BTIM_Cmd(CW_BTIM1, ENABLE);
  15. }


  16. void BTIM1_IRQHandler(void)
  17. {
  18.         if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
  19.         {
  20.                 BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
  21.                 SystemTick++;
  22.         }
  23. }


  24. uint32_t SystemGetTick(void)
  25. {
  26.         return SystemTick;
  27. }

(2)时钟切换到PLL

默认的是HSI,本文使用HSE,再切换到PLL至64MHZ。

  1. RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE);   //打开FLASH时钟

  2.         RCC_HSE_Enable(RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL,RCC_HSE_FLT_CLOSE);
  3.         RCC_PLL_Enable(RCC_PLLSOURCE_HSECLK, 16000000, 4);
  4.         
  5.         FLASH_SetLatency(FLASH_Latency_2);    //频率大于24M需要配置FlashWait=2

  6.         while(RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL ));
  7.         
  8.         
  9.         RCC_SYSCLKSRC_Config(RCC_SYSCLKSRC_PLL);
  10.         RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
  11.         RCC_PCLKPRS_Config(RCC_PCLK_DIV1);

(3)点灯

  1. void LedInit(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.         
  5.         RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOB,ENABLE);

  6.     GPIO_InitStruct.IT = GPIO_IT_NONE;
  7.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  8.     GPIO_InitStruct.Pins = GPIO_PIN_8 | GPIO_PIN_9;
  9.     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;

  10.     GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
  11. }


  12. void SystemRun(void)
  13. {
  14.         static uint32_t curtick=0;
  15.         
  16.         if(SystemGetTick()-curtick>=500)
  17.         {
  18.         GPIO_TogglePin(CW_GPIOB, GPIO_PIN_8 | GPIO_PIN_9);

  19.                 curtick=SystemGetTick();
  20.         }        
  21. }

5、现象

blink.gif





海滨消消 发表于 2022-7-13 15:55 来自手机 | 显示全部楼层
感谢分享测评贴,恭喜亮灯
huquanz711 发表于 2022-7-13 18:41 来自手机 | 显示全部楼层
超频的话能不能正常运行
 楼主| freeelectron 发表于 2022-7-13 20:17 | 显示全部楼层
huquanz711 发表于 2022-7-13 18:41
超频的话能不能正常运行

64M,没有超频哦
mcu021 发表于 2022-7-14 22:27 | 显示全部楼层
超到了88MHz,正常运行。

评论

确定不是你的错觉?!试试测量一下HCLK_OUT,PCLK_OUT的频率。  发表于 2022-7-15 09:02
zhouminjie 发表于 2022-7-20 14:43 | 显示全部楼层
主频64M,FLASH_Latency_2是不是需要改为FLASH_Latency_3
uytyu 发表于 2022-8-18 17:54 | 显示全部楼层
不是只能48Mhz的频率吗   
minzisc 发表于 2022-11-3 20:45 | 显示全部楼层
如何设置为48Mhz的频率呢              
plsbackup 发表于 2022-11-3 20:58 | 显示全部楼层
CW32F030CxTx 最大支持多大的频率?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

66

主题

786

帖子

11

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