历史上的今天
今天是:2025年01月29日(星期三)
2019年01月29日 | STM32基础设计(1)---点亮LED灯
2019-01-29 来源:eefocus
首先,总结全文,用STM32f103c8点亮LED的大概步骤为:
定义GPIO口结构体
使能相关gpio口的时钟
如果GPIO口有其他重映射功能,先失能其重映射。
操纵相应GPIO口,实现LED灯的亮灭。
下面详细解释具体步骤:
1,定义GPIO口
库函数中GPIO结构体:
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
根据库函数,博主是这样定义的:
GPIO_InitTypeDef B_IO;
根据此结构体就可以明确使用GPIOx口的某个引脚,引脚的最大速率以及引脚的使用模式。
模式分别有:模拟输入模式,浮空输入模式(复位口的状态)、上拉/下拉输入模式、通用推挽输出模式、通用开漏输出模式、复用功能推挽输出模式、复用功能开漏输出模式。
速率可根据相应要求,设置为10Mhz、2Mhz、50Mhz。
接下来给GPIO口赋值:
B_IO.GPIO_Pin = GPIO_Pin_3;
B_IO.GPIO_Speed = GPIO_Speed_50MHz;
B_IO.GPIO_Mode = GPIO_Mode_Out_PP;//此为推挽输出
GPIO_Init(GPIOB,&B_IO);//通过GPIO_Init()函数初始化GPIO口。
2.使能相关gpio口的时钟
函数库中相关的函数为:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
详细内容请自查。
博主用的STM32板子上GPIOB的第3引脚连接了LED灯,但是根据STM32中文手册,这个引脚重映射了,所以要关闭其重映射,才可以用GPIOB_Pin_3引脚。

调整引脚映射需要用到这个库函数:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
另外,对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。
AFIO_MAPR:配置复用功能重映射
AFIO_EXTICRX:配置外部中断线映射
AFIO_EVCR: 配置EVENTOUT事件输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
4.控制引脚信号,实现LED灯的亮灭
定义了GPIO口变量,又使能了时钟,这样相关引脚就可以直接控制了。
delay(1000);
GPIOB->BSRR = GPIO_Pin_3;//Pin_3置1
delay(1000);
GPIOB->BRR = GPIO_Pin_3;//置0
delay(1000);
GPIOB->BSRR = GPIO_Pin_3;
可以通过GPIO寄存器BRR、BSRR来设置相关引脚的信号。
简单地说:
对于低16位而言,BRR是用来置0的,BSRR是用来置1的。
对于高16位而言,BRR的高16位保留,BSRR的高16位是用来置0的。
具体的请自查STM32中文手册115页。
因为PB3引脚接着一个电源,故PB3为低电平时灯亮,高电平时灯灭。
详细代码如下:
#include
#define uint unsigned int
#define uchar unsigned char
void delay(uint n)
{
int i,j;
for(i=0;i for(j=0;j<8500 ; j++); } int main(void) { GPIO_InitTypeDef B_IO; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); B_IO.GPIO_Pin = GPIO_Pin_3; B_IO.GPIO_Speed = GPIO_Speed_50MHz; B_IO.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB,&B_IO); GPIOB->BRR=GPIO_Pin_3; while(1) { delay(1000); GPIOB->BSRR = GPIO_Pin_3; delay(1000); GPIOB->BRR = GPIO_Pin_3; delay(1000); GPIOB->BSRR = GPIO_Pin_3; } }
史海拾趣
|
AVR单片机的编译软件五花八门,用宋丹丹的话就是:那是相当的多 汇编语言的开发平台就不说了(俺不大会,呵呵,说不出什么道道来)。 简单列举几个高级语言的开发平台: WINAVR(GNU GCC AVR); ICC AVR CodeVison AVR IAR for AVR BASIC ...… 查看全部问答> |
|
大家好,我是正在使用sim300 GPRS模块,我用AVR mega16单片机控制模块进行短息发送,我用串口调试过了,一点问题也没有,但是我用单片机进行调试的时候就有问题了,大家可以给点建议?… 查看全部问答> |
|
最近做了一块板,按键部分最头痛了! 按键平时10K上拉,按键按下后就会接地,取低电平,按键值会存在一个队列中,在两边接上按键,按按键一切正常。板子上对应每个按键还有一个接触面,用导电橡胶接触,当用导电橡胶碰接触面是,反应有时正常,有 ...… 查看全部问答> |
|
void zhengti(void) { for (b=0;b 0 && PCA0L >= TIMEOUT) //高电平持续时间超过120us { ...… 查看全部问答> |
|
大虾,麻烦快给解答下。keil c ,debug 后总是进汇编模式下,还返回不到C,怎么回事 keil c ,debug 后总是进汇编模式下,还返回不到C,怎么回事,刚才还好好的,我也没动那阿。… 查看全部问答> |
|
register file 和sram 是不是内部结构都一样,就是外围电路不同啊另外为什么register file一般都只做成two port的啊,也就是说register file 只作一个端口读一个端口写的忘高人指点!… 查看全部问答> |




