你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G0-Platformio+libopencm3-定时器使用

[复制链接]
STMCU小助手 发布时间:2023-2-22 18:44
使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为定时器timer的基本使用方法。

1 新建项目
  • 在PIO主页新建项目timer,框架选择libopencm3,开发板选择 MonkeyPi_STM32_G070RB;
  • 新建完成后在src目录新建主程序文件main.c;
  • 然后更改项目文件platformio.ini的烧写和调试方式:

  1. 1upload_protocol = cmsis-dap
  2. 2debug_tool = cmsis-dap
复制代码


2 使用基本定时器
  • 定时器设置

以下为设置定时器3的过程:
  1. 1static void timer_setup(void)
  2. 2{
  3. 3    /* Enable TIM3 clock. */
  4. 4    rcc_periph_clock_enable(RCC_TIM3);
  5. 5
  6. 6    /* Enable TIM3 interrupt. */
  7. 7    nvic_enable_irq(NVIC_TIM3_IRQ);
  8. 8
  9. 9    /* Timer global mode:
  10. 10     * - No divider
  11. 11     * - Alignment edge
  12. 12     * - Direction up
  13. 13     */
  14. 14    timer_set_mode(TIM3, TIM_CR1_CKD_CK_INT,
  15. 15        TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
  16. 16
  17. 17    /*
  18. 18     * APB1 PRE = 1, TIMPCLK = PCLK
  19. 19     * APB1 PRE != 1, TIMPCLK = PCLK * 2
  20. 20     */
  21. 21    timer_set_prescaler(TIM3, (rcc_apb1_frequency/100000-1)); //100KHz
  22. 22
  23. 23    /* Disable preload. */
  24. 24    timer_disable_preload(TIM3);
  25. 25    timer_continuous_mode(TIM3);
  26. 26
  27. 27    /* Timer Period */
  28. 28    timer_set_period(TIM3, 20000-1);    /* 100kHz /20_000 = 5 Hz */
  29. 29
  30. 30    /* Counter enable. */
  31. 31    timer_enable_counter(TIM3);
  32. 32
  33. 33    timer_enable_irq(TIM3, TIM_DIER_UIE);
  34. 34}
复制代码

包括设置定时器的模式,使能定时器中断,定时器的中断频率通过 timer_set_prescaler 设置分频值和 timer_set_period 设置周期值,上面需要注意的是 timer_set_prescaler 设置分频值需要根据系统设置的时钟,如果APB1的分频为1,则TIM外设时钟和APB1相同,否则为其2倍,这里由于系统设置的时钟为64MHz,即APB1预分频为1,因此这里设置TIM分频为 rcc_apb1_frequency/100000-1,即100KHz;然后timer_set_period设置定时器周期为 20000-1,那么定时器中断频率为5Hz;

  • 定时器中断

  1. 1void tim3_isr(void)
  2. 2{
  3. 3    if(timer_get_flag(TIM3, TIM_SR_UIF)) {
  4. 4        /* Clear compare interrupt flag. */
  5. 5        timer_clear_flag(TIM3, TIM_SR_UIF);
  6. 6
  7. 7        gpio_toggle(GPIOB,GPIO4);
  8. 8    }
  9. 9}
复制代码


这里直接在中断中对GPIO进行翻转,即5Hz翻转一次GPIO,即200ms进行高低变化;

  • 烧写测试

将程序烧写到开发板后,测量频率可以看到和预期一致:

微信图片_20230222184426.png

3 使用systick定时器3.1 systick 定时器设置
  1. 1static void systick_setup(void)
  2. 2{
  3. 3    /* clock rate / 1000 to get 1mS interrupt rate */
  4. 4    systick_set_reload(64000);
  5. 5    systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
  6. 6    systick_counter_enable();
  7. 7    /* this done last */
  8. 8    systick_interrupt_enable();
  9. 9}
复制代码

这里设置systick重载值为64000,因为系统设置时钟为64MHz,那么定时器的频率为1KHz,即1ms时间定时中断;

3.2 systick 定时器中断
  1. 1volatile uint32_t tick_counter = 0;
  2. 2
  3. 3void sys_tick_handler(void)
  4. 4{
  5. 5    tick_counter++;
  6. 6}
复制代码


这里在中断函数里进行计数;

3.3 使用
一般这个systick定时器在cortex-m芯片中都存在,因此比较通用,可以用作RTOS的时基或用作延时功能,比如根据上面的tick_counter计数可以实现类似Arduino中的millis方式编程:
  • 由于定时器中断为1ms定时,因此tick_counter就是1ms的计数值

  1. 1uint32_t millis(void)
  2. 2{
  3. 3    return tick_counter;
  4. 4}
复制代码


  • 使用millis进行延时

  1. 1uint32_t lastTime = millis();
  2. 2while(1){
  3. 3    if( (millis() - lastTime) > 500) {
  4. 4        lastTime = millis();
  5. 5
  6. 6        gpio_toggle(GPIOB,GPIO4);
  7. 7    }
  8. 8
  9. 9    ...
  10. 10}
复制代码


这样就达到500ms的延时,而且不会对其他语句的执行造成影响;

转载自: MakerInChina.cn


收藏 评论0 发布时间:2023-2-22 18:44

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版