开发板:正点原子战舰V3
任务:点亮LED
引脚:led0:GPIOB_5,led1:GPIOE_5;
程序1 自建led.c库
#include"LED.h"
#include"stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
程序2 main函数:
#include"stm32f10x.h"
#include"LED.h"
#include"delay.h"
int main(void)
{
delay_init();
LED_Init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
delay_ms(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(100);
}
}
stm32f10x_gpio.h
stm32f10x_rcc.h
GPIO_InitTypeDef GPIO_InitStructure;`
为什么Init与TypeDef没有空格隔开
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
为什么GPIO_Init();要放在结构体的后面?
程序1 自建LED.c库:
#include"LED.h"
#include"stm32f10x.h"
void LED_Init(void)
{
RCC->APB2ENR |=1<<3;//时钟使能寄存器
GPIOB->CRL &= 0xFFF0FFFFF;//复位
GPIOB->CRL |= 0x000300000;//寄存器0011设置为推挽输出,且为50Hz
GPIOB->ODR |=1<<5;
RCC->APB2ENR |=1<<6;
GPIOE->CRL &= 0xFFF0FFFFF;
GPIOE->CRL |= 0x000300000;
GPIOE->ODR |=1<<5;
}
程序2 main函数:
#include"stm32f10x.h"
#include"LED.h"
#include"delay.h"
int main(void)
{
delay_init();
LED_Init();
while(1)
{
GPIOB->ODR |=1<<5;
GPIOE->ODR |=1<<5;
delay_ms(100);
GPIOB->ODR =~(1<<5);
GPIOE->ODR =~(1<<5);
delay_ms(100);
}
}
APB2 外设时钟使能寄存器(RCC_APB2ENR)
端口配置低寄存器(GPIOx_CRL)
端口输出数据寄存器(GPIOx_ODR)
端口配置低寄存器(GPIOx_CRL)为什么是***0xFFF0 FFFF***,按照十六进制算起来,***0x1111 1111 1111 0000 1111 1111 1111 1111***这样加上GPIOx_CRH,不就64位了,与32位不符和?
注:以上为我个人在学习stm32f1的过程中遇到的问题
参考资料:
《STM32库开发实战指南(第二版)》(书籍)
《STM32中文参考手册》
《正点原子手把手教你学stm32》(视频)
《野火哥带你学stm32》(视频)