请选择 进入手机版 | 继续访问电脑版
查看: 97|回复: 2

[单片机资料] STM32F030之嘀嗒定时器实现LED翻转

[复制链接]

签到天数: 395 天

[LV.9]元老将成

发表于 2018-9-13 22:25:52 | 显示全部楼层 |阅读模式
本文主要解决两个问题

1 STM32的IO口要反转,怎么实现?

2 嘀嗒定时器systick的配置

解答1:

     单片机的口,反转很容易。sbit led = P1 ^6;  led = ~led;而STM32的口要让它反转,怎样实现呢?

     很容易,对想要反转的IO口取异或: GPIOx->ODR ^= GPIO_Pin;

解答2:


SysTick是1个24bit递减计数器


SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值。

systck计数频率为每秒48000000次,所以4800000次就是1/10秒,也就是100ms。

SysTick的重装寄存器决定了定时器频率。

下面介绍STM32中的systick,Systick 部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:
STK_CSR,        0xE000E010  --  控制寄存器
STK_LOAD,     0xE000E014  --  重载寄存器
STK_VAL,        0xE000E018  --  当前值寄存器
STK_CALRB,   0xE000E01C  --   校准值寄存器
首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义
第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)
第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)
第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零

STK_LOAD  重载寄存器:
Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。

STK_VAL当前值寄存器:
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

STK_CALRB  校准值寄存器:
这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:
位31 NOREF :1=没有外部参考时钟(STCLK 不可用)0=外部参考时钟可用
位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms
位[23:0] :Calibration value
Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.

cortex_m0.c文件中定义
  1. <span style="font-size:14px;">/** \brief  System Tick Configuration
  2.     The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
  3.     Counter is in free running mode to generate periodic interrupts.
  4.     \param [in]  ticks  Number of ticks between two interrupts.
  5.     \return          0  Function succeeded.
  6.     \return          1  Function failed.
  7.     \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
  8.     function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
  9.     must contain a vendor-specific implementation of this function.
  10. */
  11. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
  12. {
  13.   if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */

  14.   SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  15.   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  16.   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  17.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  18.                    SysTick_CTRL_TICKINT_Msk   |
  19.                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  20.   return (0);                                                  /* Function successful */
  21. }</span>
复制代码
  1. <span style="font-size:14px;">#include "SysTick.h"

  2. __IO uint32_t TimingDelay;
  3. uint32_t time_count = 0;
  4. uint16_t idx_led = 0;
  5. //SystemCoreClock/100000) 10 us 进入一次中断
  6. void SysTick_Config_Init(void)
  7. {
  8.         /* SystemFrequency / 1000    1ms中断一次
  9.         * SystemFrequency / 100000         10us中断一次
  10.         * SystemFrequency / 1000000 1us中断一次
  11.         */
  12.     if(SysTick_Config(SystemCoreClock/1000))
  13.         {
  14.             while(1);
  15.         }
  16.                 // 关闭滴答定时器  
  17.         //SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
  18. }

  19. /**
  20.   * @brief  Inserts a delay time.
  21.   * @param  nTime: specifies the delay time length, in milliseconds.
  22.   * @retval None
  23.   */
  24. void Delay_ms(__IO uint32_t nTime)
  25. {
  26.         TimingDelay = nTime;
  27.         // 使能滴答定时器  
  28. //        SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;

  29.         while(TimingDelay != 0);
  30. }

  31. /**
  32.   * @brief  Decrements the TimingDelay variable.
  33.   * @param  None
  34.   * @retval None
  35.   */
  36. void TimingDelay_Decrement(void)
  37. {
  38.   if (TimingDelay != 0x00)
  39.   {
  40.     TimingDelay--;
  41.   }
  42. }

  43. void SysTick_Handler(void)
  44. {   
  45.        
  46.         TimingDelay_Decrement();
  47.        
  48.         idx_led++;
  49.         if(idx_led >= 1000){
  50.                 idx_led = 0;
  51.             GPIOA->ODR^=GPIO_Pin_4;       
  52.         }
  53. }</span>
复制代码


签到天数: 678 天

[LV.9]元老将成

发表于 2018-9-14 13:37:48 | 显示全部楼层
不错的资料
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

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

返回顶部