操作寄存器与使用库函数的不同点在于,时钟使能时,操作RCC->AHB1ENR寄存器,因为时设置GPIOF,所以要操作位5,我们这里采用位运算的方式,具体详细原理见以下图示。
然后我们再查询具体的操作要求,如下图。
可见使能位5的话需要将位5置1,所以 |= 1<<5;就满足了我们的要求。
再有我们初始化GPIO的时候用到了库函数void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD),调用这个函数与我们之前写库函数版本的时候操作GPIOx的各个寄存器是一样的,只不过是将各参数传给函数让函数帮你执行,看起来更加简洁明朗。
同样我们主要操作3个文件:led.h|、led.c、mian.c(test.c),以下即为代码;
1.led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PFout(9)
#define LED1 PFout(10)
void led_init(void);
#endif
这里的PFout可以在库文件中找到这个宏定义,意义是将ODR寄存器,与相关某寄存器的某位建立映射关系
2.led.c
#include "led.h"
void led_init(void)
{
RCC->AHB1ENR |= 1<<5; //时钟使能(原因见图示)
GPIO_Set(GPIOF, PIN9 | PIN10, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU); //GPIO初始化
LED0 = LED1 = 1;
}
3.main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //初始化延时函数
uart_init(84,115200); //串口初始化为115200
led_init(); //led初始化
while(1)
{
LED0 = 0;
LED1 = 1;
delay_ms(500);
LED0 = 1;
LED1 = 0;
delay_ms(500);
}
}
关键字:STM32 跑马灯 寄存器
引用地址:
STM32跑马灯-寄存器
推荐阅读最新更新时间:2024-11-10 20:59
STM32---IWDG看门狗与Debug
今天的问题:程序在加了看门狗之后,在线调试时,能到达断点的位置,但之后还会自动运行,无法停止。 原因:看门狗 独立看门狗(IWDG)的主要性能 1、自由运行的递减计数器 2、时钟由独立的RC振荡器提供(可在停止和待机模式下工作) 3、看门狗被激活后,则在计数器计数至0x000时产生复位 当微控制器进入调试模式时(Cortex-M3核心停止),根据调试模块中的DBG_IWDG_STOP 配置位的状态,IWDG的计数器能够继续工作或停止。 即在进入在线调试状态后,先在Peripheral的系统寄存器中找到DBG寄存器,将Bit 8DBG_IWDG_STOP置1,看门狗停止工作,然后再运行程序。
[单片机]
STM32F4学习笔记5——stm32串口发送数据最高位错误问题
最近,在做基于stm32f401串口的ModBus协议通信,遇到了stm32串口发送数据的问题。花了一整天去查找问题,从ModBus协议格式、调度算法到串口配置,最终终于把问题解决,记录下来。 问题描述: ModBus协议中配置stm32f401串口为奇校验,8位数据位,1位停止位,程序如下: void uart_init( u32 bound ) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitSt
[单片机]
stm32 运行时间测量与间隔执行
这个程序利用stm32普通定时器构成了执行时间测量功能和间隔执行函数功能,使用如下,两种功能复用,通过#define选择 //执行时间测试模式下 #define StopWatch //使用: #include Runtime.h Runtime_init(); while(1){ Runtime_start(); delay_ms(1); Runtime_stop(); delay_ms(1000); } //setInterval模式 #define setInterval setInterval(fun,1000);//传入回调,周期1.024*1000ms c文件
[单片机]
STM32入门学习笔记之MPU6050传感器解析实验3
(5) 陀螺仪采样率分频寄存器 (地址:0x19) 7 6 5 4 3 2 1 0 SMPLRT_DIV 采样频率=陀螺仪输出频率/(1+SMPLRT_DIV) (6) 配置寄存器 (地址:0x1A) 7 6 5 4 3 2 1 0 - - EXT_SYNC_SET DLPF_CFG Bit 5~Bit 3:该段内的值确定采样的值将代替传感器数据寄存器中的最低有效位 0:输入禁用 1:TEMP_OUT_L寄存器第0位 2:GYRO_XOUT_L寄存器第0位 3:GYRO_YOUT_L寄存器第0位 4:GYRO_ZOUT_L寄存器第0位 5:ACCEL_XOUT_L寄存
[单片机]
do{...} while(0U) 这种代码的作用和意义
在一些项目中,我们可能看到过很多,在学习的时候没有见过的代码,比如 do{...} while(0U) 这种代码,在我们学习的时候可能很少见,但实际项目中却存在很多类似代码。 今天就来讲讲关于 do{...} while(0U) 的内容。 1 前言 很多初学者都不知道这个“do{...} while(0U)”作用和意义,甚至觉得这样写的代码复杂且没意义。 相信使用过 STM32 Cube HAL库的朋友都知道,源码里面有许多do{...} while(0U)的宏定义语句。 今天讲的主要知识点是:HAL库中do{...} while(0U)作用和意义。 当然,do{...} while(0U)不限于HAL库中,适用于很多地方
[单片机]
STM32之窗口看门狗(WWDG)
前几天学习STM32的两条狗,先学习了宠物狗(IWDG),和其它MCU差不多,不多说了。学到警犬(WWDG)的时候,问题来了,没有IWDG那么好理解了,看了半天没有搞懂是怎么回事,计数器值、窗口值、在什么时候喂狗、什么时候产生中断等等,一头雾水。 经过两天的推敲,个人理解如下: 1、有个7位递减计数器(WWDG- CR),就这个计数器和窗口计数器(WWDG- CFR)决定什么时候喂狗。 狗喂早了,复位 早 体现在计数器值(tr) 窗口值(wr),也就是计数器值还没有减到窗口值以下; 2、当 0x40 计数器值(tr) 窗口值(wr) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适; 3、当计数器的值从0x4
[单片机]
GPIO资源总结
STM32Fx系列 GPIO基本结构 保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作。 P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这里的电路会在下面很详细地分析到。 TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“
[单片机]
STM32固件库
很久没有碰单片机了,两年了吧,因为项目需要,最近入手一块红牛的开发板,核心为STM32F103ZE。虽然以前做过大概半年的stm32的开发,现在天天在.net平台下写代码,已经忘记的差不多,恰逢周末,补补课,以后用的时候也方便点。 ST推出的FW大大提高了单片机SW的开发效率,所以在新建工程前先来了解下这个SDK。我使用的是最新的v3.5固件库,这个固件库可以分为三个部分: 1、内核支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport) 2、硬件系统支持(..STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSI
[单片机]