led.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #include "led.h"
  2. #include "bsp.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  5. //ALIENTEK战舰STM32开发板
  6. //LED驱动代码
  7. //正点原子@ALIENTEK
  8. //技术论坛:www.openedv.com
  9. //修改日期:2012/9/2
  10. //版本:V1.0
  11. //版权所有,盗版必究。
  12. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  13. //All rights reserved
  14. //////////////////////////////////////////////////////////////////////////////////
  15. //初始化PB5和PE5为输出口.并使能这两个口的时钟
  16. //LED IO初始化
  17. void LED_Init(void)
  18. {
  19. // GPIO_InitTypeDef GPIO_InitStructure;
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
  21. #ifdef COLLECT_DEVICE
  22. //LED_RUN(PE14)
  23. GPIO_COMM_Init(RCC_APB2Periph_GPIOE, GPIOE,
  24. GPIO_Pin_14, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  25. #else
  26. //LED_RUN(PC2)
  27. GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC,
  28. GPIO_Pin_2, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  29. #endif
  30. }
  31. //通用定时器中断初始化
  32. //这里时钟选择为APB1的2倍,而APB1为36M
  33. //arr:自动重装值。
  34. //psc:时钟预分频数
  35. //这里使用的是定时器3!
  36. __IO uint32_t led0_cnt_dir = 0;
  37. __IO uint32_t led0_pwm_val = 0;
  38. uint32_t led1_delay = 3;
  39. uint32_t led2_delay = 3;
  40. uint32_t led3_delay = 3;
  41. uint8_t led1_duty = LED1_DUTY;
  42. uint8_t led2_duty = LED2_DUTY;
  43. uint8_t led3_duty = LED3_DUTY;
  44. uint32_t led1_cycle = LED1_CYCLE;
  45. uint32_t led2_cycle = LED2_CYCLE;
  46. uint32_t led3_cycle = LED3_CYCLE;
  47. uint16_t CCR1_Val = LED0_CYCLE;
  48. uint16_t CCR2_Val = LED1_CYCLE;
  49. uint16_t CCR3_Val = LED2_CYCLE;
  50. uint16_t CCR4_Val = LED3_CYCLE;
  51. //uint16_t PrescalerValue = 0;
  52. uint16_t capture = 0;
  53. void TIM3_Int_Init(u16 arr,u16 psc)
  54. {
  55. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  56. TIM_OCInitTypeDef TIM_OCInitStructure;
  57. NVIC_InitTypeDef NVIC_InitStructure;
  58. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  59. // PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 500) - 1;//=168
  60. /* Time base configuration */
  61. TIM_TimeBaseStructure.TIM_Period = arr;//65535
  62. TIM_TimeBaseStructure.TIM_Prescaler = psc;
  63. TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  64. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  65. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  66. /* Prescaler configuration */
  67. //TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);//对72MHz进行710分频,即为50KHz
  68. /* Output Compare Timing Mode configuration: Channel1 */
  69. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  70. TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  71. TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  72. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
  73. /* Output Compare Timing Mode configuration: Channel2 */
  74. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  75. TIM_OCInitStructure.TIM_Pulse = 10;//CCR2_Val;
  76. TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  77. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
  78. /* Output Compare Timing Mode configuration: Channel3 */
  79. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  80. TIM_OCInitStructure.TIM_Pulse = 10;//CCR3_Val;
  81. TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  82. TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);
  83. /* Output Compare Timing Mode configuration: Channel4 */
  84. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  85. TIM_OCInitStructure.TIM_Pulse = 10;//CCR4_Val;
  86. TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  87. TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Disable);
  88. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  89. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
  90. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
  91. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  92. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  93. /* TIM Interrupts enable */
  94. TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);
  95. /* TIM3 enable counter */
  96. TIM_Cmd(TIM3, ENABLE);
  97. LED0 = 0;
  98. LED1 = 0;
  99. LED2 = 0;
  100. LED3 = 0;
  101. capture = TIM_GetCapture1(TIM3);
  102. TIM_SetCompare1(TIM3, capture + 100);
  103. capture = TIM_GetCapture1(TIM3);
  104. TIM_SetCompare2(TIM3, capture + 100);
  105. capture = TIM_GetCapture1(TIM3);
  106. TIM_SetCompare3(TIM3, capture + 100);
  107. capture = TIM_GetCapture1(TIM3);
  108. TIM_SetCompare4(TIM3, capture + 100);
  109. }
  110. void TIM3_Int_Deinit(void)
  111. {
  112. NVIC_InitTypeDef NVIC_InitStructure;
  113. TIM_DeInit(TIM3);
  114. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  115. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
  116. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
  117. NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; //IRQ通道被使能
  118. NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  119. /* TIM Interrupts enable */
  120. TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, DISABLE);
  121. /* TIM3 enable counter */
  122. TIM_Cmd(TIM3, DISABLE);
  123. }
  124. //uint8_t time[4]={0,0,0,0};
  125. //void TIM3_IRQHandler(void) //TIM3中断
  126. //{
  127. //
  128. // //
  129. // if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  130. // {
  131. // TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
  132. // if(led1_delay>0)led1_delay--;
  133. //
  134. // if(led1_delay>10*100)led1_delay=0;
  135. //
  136. // capture = TIM_GetCapture1(TIM3);
  137. // TIM_SetCompare1(TIM3, capture + CCR1_Val);
  138. //
  139. // }
  140. // /*7500为一个循环,周期为7500/500000=0.015,频率为66.67Hz*/
  141. // if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  142. // {
  143. // TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
  144. // if(led1_delay!=0){
  145. // if(LED1)
  146. // {
  147. // LED1=0; //PB9=0。ARR增加5000后,到达这条语句。
  148. // CCR2_Val=(led1_cycle * led1_duty / 100); //占空比
  149. // }
  150. // else
  151. // {
  152. // LED1=1; //PB9=1
  153. // CCR2_Val=led1_cycle-(led1_cycle * led1_duty / 100);
  154. // } //在原来的CCR1(即capture)基础上加5000,则再过5000,又会触发中断
  155. // //另外,有个问题,进入中断时,当ARR计数器快加到65535,而又不足5000时,不是会有数据多余,而产生波形的移动吗?
  156. // //回答:不用担心。例如进入中断是,ARR=65000,65000+5000=70000>65535,那么高位会舍去,即为70000-65536=4464
  157. // //等于是来了个循环,两次中断间ARR的增量还是5000。所以为了波形的稳定,初始化时,必须要有TIM_Period = 65535
  158. // }
  159. //
  160. // if(led1_delay>0)led1_delay--;
  161. // if(led1_delay>10*100)led1_delay=10*100;
  162. // else{
  163. // LED1=1;
  164. // }
  165. //
  166. // capture = TIM_GetCapture2(TIM3);
  167. // TIM_SetCompare2(TIM3, capture + CCR2_Val);
  168. // }
  169. // if (TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
  170. // {
  171. // TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
  172. //
  173. // if(led2_delay!=0){
  174. // if(LED2)
  175. // {
  176. // LED2=0; //PB7=0。ARR增加5000后,到达这条语句。
  177. // CCR3_Val=(led2_cycle * led2_duty / 100); //占空比
  178. // }
  179. // else
  180. // {
  181. // LED2=1; //PB7=1
  182. // CCR3_Val=led2_cycle-(led2_cycle * led2_duty / 100);
  183. // }
  184. //
  185. // if(led2_delay>0)led2_delay--;
  186. // if(led2_delay>10*100)led2_delay=10*100;
  187. // }
  188. // else{
  189. // LED2=1;
  190. // }
  191. // capture = TIM_GetCapture3(TIM3);
  192. // TIM_SetCompare3(TIM3, capture + CCR3_Val);
  193. // }
  194. // if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET) {
  195. // TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
  196. //
  197. // if(led3_delay!=0){
  198. // if(LED3)
  199. // {
  200. // LED3=0; //PB8=0。ARR增加5000后,到达这条语句。
  201. // CCR4_Val=(led3_cycle * led3_duty / 100); //占空比
  202. // }
  203. // else
  204. // {
  205. // LED3=1; //PB8=1
  206. // CCR4_Val=led3_cycle-(led3_cycle * led3_duty / 100);
  207. // }
  208. //
  209. // if(led3_delay>0)led3_delay--;
  210. // if(led3_delay>10*100)led3_delay=10*100;
  211. // }
  212. // else{
  213. // LED3=1;
  214. // }
  215. // capture = TIM_GetCapture4(TIM3);
  216. // TIM_SetCompare4(TIM3, capture + CCR4_Val);
  217. // }
  218. //}
  219. void start_led(uint8_t led,uint32_t delay, uint8_t duty,uint32_t period){
  220. if(led == 1){
  221. LED1=0;
  222. led1_delay = delay;
  223. led1_duty = duty;
  224. led1_cycle = period;
  225. capture = TIM_GetCapture2(TIM3);
  226. TIM_SetCompare2(TIM3, capture + led1_cycle);
  227. }
  228. else if(led == 2){
  229. LED2=0;
  230. led2_delay = delay;
  231. led2_duty = duty;
  232. led2_cycle = period;
  233. capture = TIM_GetCapture3(TIM3);
  234. TIM_SetCompare3(TIM3, capture + led2_cycle);
  235. }
  236. else if(led == 3){
  237. LED3=0;
  238. led3_delay = delay;
  239. led3_duty = duty;
  240. led3_cycle = period;
  241. capture = TIM_GetCapture4(TIM3);
  242. TIM_SetCompare4(TIM3, capture + led3_cycle);
  243. }
  244. }