微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 工程师STM32单片机学习基础手记(4):用PWM实现荧火虫灯

工程师STM32单片机学习基础手记(4):用PWM实现荧火虫灯

时间:10-07 来源:本站整理 点击:

XCEL可以方便地计算出第一象限的16个点的数据:

  280,307,335,361,387,412,436,458,478,496,513,527,539,548,555,559

  有了第一象限,其他象限都可以镜像生成了。具体方法请看源程序。

  要用上面的例子修改,还需要做一些工作。

  前面是在SysTick中做出标志,然后在主程序中修改CCR1的值,现在不行了,肯定会有时间的误差,不能这做么,要在PWM输出后修正,这样就要在PWM波形输出时产生中断。因此,需要在main函数中增加以下这个函数。

  


  这个函数哪里来的呢,很简单,从timebase工程中中抄来的然后将TIM2改成TIM3就行了^_^。然后在main函数中调用它。

  注意,还需要打开stm32f10x_conf.h文件,将下面:

  


  蓝色框里面的包含文件给"解放"出来。当然,同时要把库中的misc.c源程序文件加入工程中来。否则,编译是通不过的。

  为了让通道1可以产生中断,还需要做一件事,就是下面蓝色的部分。

  /* TIM IT enable */

  TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

  //也是从TIMEBASE工程中抄来,再将TIM2改成TIM3的。

  /* TIM3 enable counter */

  TIM_Cmd(TIM3, ENABLE);

  现在该到stm32f10x_it.c中去了,增加一个中断处理函数:

  uint16_t sinTab[]={280,307,335,361,387,412,436,458,478,496,513,527,539,548,555,559};

  uint8_t Count1,Count2; //1.像限计数器,其值在0~3之间变化 2.其值在0~31之间变化

  void TIM3_IRQHandler(void)

  {

  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)

  {

  TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

  if(Count2%2==0) //准备更新,新的值会在下一次更新

  { switch(Count1)

  { case 0: //象限1

  {

  TIM3-》CCR1= sinTab[Count2/2];

  break;

  }

  case 1: //象限2

  { TIM3-》CCR1=sinTab[15-Count2/2];

  break;

  }

  case 2: //象限3

  { TIM3-》CCR1=560-sinTab[Count2/2];

  break;

  }

  case 3: //象限4

  { TIM3-》CCR1=560-sinTab[15-Count2/2];

  break;

  }

  default:break;

  }

  }

  }

  if(++Count2==32)

  { Count2=0;

  if(++Count1==4)

  Count1=0;

  }

  }

  也就是在这里,搞清楚了,所谓的"我有些怀疑上面提到的那个CCR1没有立即变化仅仅只是调试器的问题"不对,这是CCR1更新方法的问题,

  


  注意上图中红色框中的描述。

  这里就是不用立即更新的方法。因为每个点的PWM波形会出现2次,因此,用

  if(Count2%2==0) 来判断是第一次产生PWM波形,更新CCR1,但是这个CCR1不会立即更新,而会在下一次产生PWM事件时更新。

  STM32的SDIO控制SD卡

  一、STM32的SDIO适配器的结构

  STM32的SDIO适配器包括与AHB总线接口和SD卡接口两个大块儿。如下面图中两个灰色阴影区域。

  左侧的阴影部分又细分两个子单无,适配器寄存器组和FIFO。适配器寄存器组包含了所有SDIO所有的寄存器,这些寄存器用于配置一些参数,以实现一些SD协议中的时序,最终于实现SD卡的命令传输。FIFO则是为了实现数据的传输,这两者部分分别代表者对SD卡的两种传输操作,即命令的传输和数据的传输。

  右侧的阴影部分,即SDIO适配器的SD卡接口大块儿,又细分为三个子单元。控制单元(Control Unit),命令通道和数据通道(Command Path and Data Path)。控制单元主要实现电源和时钟的控制。它根据适配器寄存器组中寄存器的配置,开启和关闭SDIO适配器模块的电源,改变工作的时钟源(直接使用 SDIO_CLK还是其分频后的时钟等)。命令通道连接CMD线,控制命令的传输。数据通道连接数据线(DAT0~DAT7),控制数据的传输。

  


  二、分单元详述

  下面按照上面一章提到的五个子单元的划分,对各子单元进行详细的描述。

  1、适配器寄存器组

  The adapter register block contains all system registers. This block also generates the signals that clear the static flags in the multimedia card. The clear signals are generated when 1 is written into the corresponding bit location in the SDIO Clear register.

  这个STM32数据手册上关于这一部分的全部描述,大体上就是说:适配器寄存器组包含了所有的系统寄存器。它还产生用于清除MMC卡的静态标志位的信号。当向SDIO Clear register(清除寄存器)的对应位写1,即产生这个信号。

  2、控制单元

这一单元又在内部分为电源管理和时钟管理两个子

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top