重点提醒:一定要学会看你所用开发板的原理图
比如我用的是野火霸道V2的开发板,原理图中led部分如下
可见该led是一个RGB灯,控制引脚为PB0,PB1,PB5,且为低电平点亮
rcc.h和gpio.h里面的函数我已经详细解释过了,想知道的可以去看我之前的学习笔记
Delay文件也在之前的学习笔记中有全部代码
1.新建工程
1.复制STM32学习笔记(2)- 库函数点亮LED灯的工程文件
2.添加Delay文件到工程中
3.实现流水灯的效果,我用了GPIO_Write()这个函数,从它的定义,我们可以看出,它需要传入端口输出数据寄存器的值,
/**
* @brief Writes data to the specified GPIO data port.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param PortVal: specifies the value to be written to the port output data register.
* @retval None
*/
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
GPIOx->ODR = PortVal;
}
4.16位二进制分别对应PB0到PB15共16个端口
5.转到引脚的定义可以看到引脚对应的寄存器值
6.main.c全部代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0 | GPIO_Pin_5; //选择你的led灯的gpio引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
while(1)
{
GPIO_Write(GPIOB, ~0x0001); //使用寄存器参数,c语言不支持二进制,所以使用十六进制,又因为led是低电平点亮,所以按位取反
Delay_ms(100);
GPIO_Write(GPIOB, ~0x0002); //PB1
Delay_ms(100);
GPIO_Write(GPIOB, ~0x0020); //PB5
Delay_ms(100);
}
}
2.效果图
效果图我用了STM32F103C8T6, PA0(TIM2_CH1)输出
led流水灯