野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17326|回复: 8

STM32F103 点亮LED的另一种写法

[复制链接]
发表于 2016-9-7 09:52:32 | 显示全部楼层 |阅读模式
  1. #ifndef __BSP_LED_  
  2. #define __BSP_LED_  
  3.   
  4. #include <MM32x103.h> // 这个换成STM32的库文件就行  
  5. #include "type.h"  // 这个文件就是重定义了一些数据类型,博客里面有
  6.   
  7. //==================================================================================  
  8. #define LED1_RUN_GRP         GPIOC  
  9. #define LED1_RUN_IDX          GPIO_Pin_6  
  10. #define LED1_RUN_OFF()       GPIO_ResetBits(LED1_RUN_GRP, LED1_RUN_IDX)  
  11. #define LED1_RUN_ON()        GPIO_SetBits(LED1_RUN_GRP, LED1_RUN_IDX)  
  12. #define LED1_RUN_IS_OFF()  GPIO_ReadOutputDataBit(LED1_RUN_GRP, LED1_RUN_IDX)  
  13.   
  14. #define LED2_RUN_GRP         GPIOA  
  15. #define LED2_RUN_IDX          GPIO_Pin_11  
  16. #define LED2_RUN_OFF()       GPIO_ResetBits(LED2_RUN_GRP, LED2_RUN_IDX)  
  17. #define LED2_RUN_ON()        GPIO_SetBits(LED2_RUN_GRP, LED2_RUN_IDX)  
  18. #define LED2_RUN_IS_OFF()  GPIO_ReadOutputDataBit(LED2_RUN_GRP, LED2_RUN_IDX)  
  19.   
  20. #define LED3_RUN_GRP         GPIOA  
  21. #define LED3_RUN_IDX          GPIO_Pin_12  
  22. #define LED3_RUN_OFF()       GPIO_ResetBits(LED3_RUN_GRP, LED3_RUN_IDX)  
  23. #define LED3_RUN_ON()        GPIO_SetBits(LED3_RUN_GRP, LED3_RUN_IDX)  
  24. #define LED3_RUN_IS_OFF()  GPIO_ReadOutputDataBit(LED3_RUN_GRP, LED3_RUN_IDX)  
  25. //==================================================================================  
  26. #define LED_COUNT   3 // LED个数自己定义  
  27.   
  28. typedef enum  
  29. {  
  30.     RED   = 0x04,  
  31.     GREEN = 0x02,  
  32.     BLUE  = 0x01  
  33. } led_t;  
  34.   
  35. typedef struct  
  36. {  
  37.     GPIO_TypeDef *GPIOx;  
  38.     uint32_t pos;  
  39. } led_port_t;  
  40.   
  41. //==================================================================================  
  42. void GPIOConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIOMode_TypeDef GPIO_Mode);  
  43. void LEDConfig((uint8_t value) // value:1/2/4 --- RED GREEN BLUE   
  44. void LEDSet(uint8_t value);  
  45. void LEDReset(uint8_t value);  
  46. void LEDToggle(uint8_t value);  
  47.   
  48. #endif /* __BSP_LED_ */  
复制代码
  1. #include "bsp_led.h"  
  2.   
  3. static led_port_t led_port[LED_COUNT] =  
  4. {  
  5.     {LED1_RUN_GRP, LED1_RUN_IDX}, /*蓝灯*/  
  6.     {LED2_RUN_GRP, LED2_RUN_IDX}, /*绿灯*/  
  7.     {LED3_RUN_GRP, LED3_RUN_IDX}, /*红灯*/  
  8. };  
  9.   
  10. // GPIO配置  
  11. void GPIOConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIOMode_TypeDef GPIO_Mode)  
  12. {  
  13.     GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化结构体变量  
  14.   
  15.     // 这个GPIO口需要改的,根据自己情况而定  
  16.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);  //开启GPIO时钟  
  17.   
  18.     //配置连接LED的GPIO为推挽输出模式  
  19.     GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin;  
  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  21.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode;  
  22.     GPIO_Init(GPIOx, &GPIO_InitStructure);  
  23. }  
  24.   
  25. // LED GPIO配置  
  26. void LEDConfig((uint8_t value) // value:1/2/4 --- RED GREEN BLUE   
  27. {  
  28.     uint8_t i, mask = 1;  
  29.   
  30.     for(i = 0; i < LED_COUNT; ++i)  
  31.     {  
  32.         if(value & mask)  
  33.         {  
  34.             GPIOConfig(led_port[i].GPIOx, led_port[i].pos, GPIO_Mode_Out_PP);  
  35.             GPIO_ResetBits(led_port[i].GPIOx, led_port[i].pos);  
  36.         }  
  37.   
  38.         mask <<= 1;  
  39.     }  
  40. }  
  41.   
  42. /* 根据参数来打开LED灯 */  
  43. void LEDSet(uint8_t value)   
  44. {  
  45.     uint8_t i, mask = 1;  
  46.    
  47.     for(i = 0; i < LED_COUNT; ++i)  
  48.     {  
  49.         if(value & mask)  
  50.         {  
  51.             GPIO_SetBits(led_port[i].GPIOx, led_port[i].pos);  
  52.         }  
  53.   
  54.         mask <<= 1;  
  55.     }  
  56. }  
  57. /* 根据参数来关闭LED灯 */  
  58. void LEDReset(uint8_t value)  
  59. {  
  60.     uint8_t i, mask = 1;  
  61.   
  62.     for(i = 0; i < LED_COUNT; ++i)  
  63.     {  
  64.         if(value & mask)  
  65.         {  
  66.             GPIO_ResetBits(led_port[i].GPIOx, led_port[i].pos);  
  67.         }  
  68.   
  69.         mask <<= 1;  
  70.     }  
  71. }  
  72.   
  73. // 取反  
  74. void LEDToggle(uint8_t value)  
  75. {  
  76.     uint8_t i, mask = 1;  
  77.   
  78.     for(i = 0; i < LED_COUNT; ++i)  
  79.     {  
  80.         if(value & mask)  
  81.         {  
  82.             if(GPIO_ReadOutputDataBit(led_port[i].GPIOx, led_port[i].pos) == 0)  
  83.             {  
  84.                 GPIO_SetBits(led_port[i].GPIOx, led_port[i].pos);  
  85.             }  
  86.             else  
  87.             {  
  88.                 GPIO_ResetBits(led_port[i].GPIOx, led_port[i].pos);  
  89.             }  
  90.         }  
  91.   
  92.         mask <<= 1;  
  93.     }  
  94. }  
复制代码

更多分享请关注csdn博客:http://blog.csdn.net/wqx521

回复

使用道具 举报

发表于 2016-9-7 10:03:49 | 显示全部楼层
不错哦,用数组来存储设备的引脚相关的配置,之前也见过不少程序是这样写的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-7 10:10:29 | 显示全部楼层
随风 发表于 2016-9-7 10:03
不错哦,用数组来存储设备的引脚相关的配置,之前也见过不少程序是这样写的

这个拓展性还是蛮不错的,我就一直这么再用,个人觉得更加直观。封装GPIO口及引脚方便拓展。
回复 支持 反对

使用道具 举报

发表于 2016-9-7 11:16:58 | 显示全部楼层
666666,看来动手能力不错啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-7 11:56:03 | 显示全部楼层
落花笑彷徨ㄟ 发表于 2016-9-7 11:16
666666,看来动手能力不错啊

多看多练。你也可以的。
回复 支持 反对

使用道具 举报

发表于 2016-9-7 14:01:40 | 显示全部楼层
不错  不错                  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-7 16:58:35 | 显示全部楼层

,没事瞎写写。
回复 支持 反对

使用道具 举报

发表于 2016-9-7 17:41:38 | 显示全部楼层
能调试吗   
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-9-7 20:41:44 | 显示全部楼层

这个我调试过了的,写个main,测试一下就知道了。把IO口引脚换一下就行了。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 18:43 , Processed in 0.031899 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表