历史上的今天
今天是:2024年08月31日(星期六)
2020年08月31日 | STM32——利用STM32CubeMX来点亮GPIO口的led
2020-08-31 来源:eefocus
GPIO口的 LED 点亮(以STM32F407IGTb芯片为例 )
1、掌握的GPIO口的使用方法
2、熟悉Keil uVision5工具软件的使用
原理:
只要是对硬件操作,就要首先查看原理图。
查看外设是给模块的MCU的哪个引脚相连。
FS-STM32F407开发平台上的LED的亮灭状态,与芯片上的引脚I/O输出电平有关。
FS-STM32F407开发平台上LED的I/O扩展:

IO操作重要结构体:GPIO_InitTypeDef
typedef struct
{
uint32_t Pin; 操作的管脚
uint32_t Mode; 模式选择
uint32_t Pull; 上拉下拉,或者都不加
uint32_t Speed; 速度选择
uint32_t Alternate; 管脚复用模式
} GPIO_InitTypeDef;
1、Mode
输入(复位状态)/input(reset state)
通用输出模式 / general purpose output mode
复用功能模式 / alternate function mode
模拟模式 / analog mode
#define GPIO_MODE_INPUT ((uint32_t)0x00000000) /*!< Input Floating Mode */
#define GPIO_MODE_OUTPUT_PP ((uint32_t)0x00000001) /*!< Output Push Pull Mode*/
#define GPIO_MODE_OUTPUT_OD ((uint32_t)0x00000011) /*!< Output Open Drain Mode*/
#define GPIO_MODE_AF_PP ((uint32_t)0x00000002) /*!< Alternate Function Push Pull Mode*/
#define GPIO_MODE_AF_OD ((uint32_t)0x00000012) /*!< Alternate Function Open Drain Mode*/
2、Speed
为了降低STM32处理器的功耗,可以依据实际的需求,选择合适的时钟速率,GPIO口支持的最大时钟速率越低,它产生的功耗也越低。
#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW
#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM
#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH
#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH
3、初始化GPIO的代码
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOF_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9 |GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
}
调用的HAL函数解析: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin, GPIO_PinState PinState);
该函数其实是对BSRR 寄存器进行操作,第一个参数传的是GPIO所在的组,第二个是操作第几个管脚,第三个是对管脚进行置位。
利用STM32CubeMX来架构程序
1、打开STM32CubeMX选择芯片

2、对管脚进行配置

3、点击CONFIGURATION

4、点击生成工程按钮

源代码:
(仅需要用户添加的代码)
/* USER CODE BEGIN 0 */
#define led1_port GPIOF
#define led1_pin GPIO_PIN_7
#define led2_port GPIOF
#define led2_pin GPIO_PIN_8
#define led3_port GPIOF
#define led3_pin GPIO_PIN_9
#define led4_port GPIOF
#define led4_pin GPIO_PIN_10
#define set_high(p,i) {p->BSRR = i;} //给高电平 熄灭
#define set_low(p,i) {p->BSRR = (uint32_t)i << 16U;} //给低电平 点亮
#define led1_off set_high(led1_port,led1_pin)
#define led1_no set_low(led1_port,led1_pin)
#define led2_off set_high(led2_port,led2_pin)
#define led2_no set_low(led2_port,led2_pin)
#define led3_off set_high(led3_port,led3_pin)
#define led3_no set_low(led3_port,led3_pin)
#define led4_off set_high(led4_port,led4_pin)
#define led4_no set_low(led4_port,led4_pin)
void led_1234(void);
/* USER CODE END 0 */
.
.
.
/* USER CODE BEGIN 3 */
led_1234();--------------------main函数中调用
/* USER CODE END 3 */
.
.
.
/* USER CODE BEGIN 4 */
void led_1234(void)
{
led1_no; //led1打开
HAL_Delay(1000); //延时1秒
led1_off; //led1关闭
HAL_Delay(1000); //延时1秒
led2_no; //led2打开
HAL_Delay(1000); //延时1秒
led2_off; //led2关闭
HAL_Delay(1000); //延时1秒
led3_no; //led3打开
HAL_Delay(1000); //延时1秒
led3_off; //led3关闭
HAL_Delay(1000); //延时1秒
led4_no; //led4打开
HAL_Delay(1000); //延时1秒
led4_off; //led4关闭
HAL_Delay(1000); //延时1秒
}
/* USER CODE END 4 */
编程要点:
1.使能GPIO端口时钟
2.初始化GPIO目标引脚为推挽输出
3.控制GPIO引脚输出高低电平
史海拾趣
|
假如有两个一样的恒流源,分别接到背靠背的两只电阻上,这样就可以类似电桥那样,通过检测其电压的微小差异,来达到精确的对比的目的。这样就把问题归结到如何精确的产生两个相同的电流的问题上,而这两个电流的绝对值或者少许变动,都对结果影响不 ...… 查看全部问答> |
|
最近项目上碰到个问题。采用2440的处理器,wince5.0系统,原先是直接控制18位色的TTL接口TFT液晶,看了屏的资料,亮度是可以用PWM调节的,编了个简单的驱动,功能基本实现,但是好像不支持对比度调节。可现在要求控制VGA接口的普通台式机的液晶显示 ...… 查看全部问答> |
|
如果大家谁知道麻烦告诉我一声,因为我这里很多例子程序全是这一个毛病,不知道怎么解决。好心的高手,谢谢了,帮我一下吧 我是第一次学习51用的是C8051F410,大家解说最好也要详细点! *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL & ...… 查看全部问答> |
|
好久没有来论坛了 上传个重量级的资料 这个是TI关于CC2530的设计资料 貌似很多人都是拿这个材料做板子的 材料中包括原理图 PCB 材料清单 以及做板子的geber文件   ...… 查看全部问答> |
|
//send address to sl××e USISRL = 0x40; // ... and transmit address, R/W = 0 USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address while(bit_is_clear(USICTL1, USIIFG)); ...… 查看全部问答> |




