STM32笔记2:建库操作之点亮LED

发布者:真情相伴最新更新时间:2019-06-24 来源: eefocus关键字:STM32  建库操作  点亮LED 手机看文章 扫描二维码
随时随地手机看文章

/**新建工程模板

建库之点亮LED灯

**/


#include "stm32f4xx.h"

//总线

#define PERIPH_BASE ((unsigned int)0x40000000)

#define AHB1PERIPH_BASE (PERIPH_BASE+0x00020000)  

#define GPIOH_BASE (AHBPERIPH_BASE+0x00001c00)  



#define GPIOH_MODER *(unsigned int*)(GPIOH_BASE+0x00)  

#define GPIOH_ODR *(unsigned int*)(GPIOH_BASE+0x14)  

#define RCC_BASE (AHB1PERIPH_BASE+0X00003800)

#define RCC_AHB1ENR     *(unsigned int *)(RCC_BASE+0x30)  


int main(void)

{

RCCAHB1PERIPH_BASE |= (1<<7);

 

GPIOH_MODER &= ~(3<<2*10); 

GPIOH_MODER |= (1<<2*10); 

//PH10输出低电平

GPIOH_ODR &= ~(1<<10); 

while(1);

}


void  SystemInit(void)

{

}





下面是我的一堆乱七八糟的解析:


/**新建工程模板

建库之点亮LED灯

**/


#include "stm32f4xx.h"

//总线

#define PERIPH_BASE ((unsigned int)0x40000000)

#define AHB1PERIPH_BASE (PERIPH_BASE+0x00020000) //AHB1PERIPH_BASE基于总线偏移

#define GPIOH_BASE (AHBPERIPH_BASE+0x00001c00) //GPIOH_BASE基于AHB1总线偏移


#define GPIOH_MODER *(unsigned int*)(GPIOH_BASE+0x00) //GPIOH_MODER寄存器基于GPIOH基地址的偏移//(unsigned int*)(GPIOH_BASE+0x00)强制指针转换,意义:将该整数转化为一个地址

#define GPIOH_ODR *(unsigned int*)(GPIOH_BASE+0x14) //括号外的*号可以放在第16行,17,20行的寄存器前面//*GPIOH_ODR = (unsigned int*)(GPIOH_BASE+0x14)

//外设基地址 :PERIPH_BASE    ->总线基地址:APB1PERIPH_BASE ->GPIO外设基地址: GPIOA_BASE ->寄存器基地址 :GPIOH_ODR 

#define RCC_BASE (AHB1PERIPH_BASE+0X00003800)

#define RCC_AHB1ENR     *(unsigned int *)(RCC_BASE+0x30) //访问一个绝对地址把一个整型数强制转换为一个指针是合法的

//*(int *)(0x67a9) = 0xaa55; 或者这样写:

//int *ptr; ptr = (int *)0x67a9;

int main(void)

{

RCCAHB1PERIPH_BASE |= (1<<7);

//STM32为了降低功耗,刚开始上电复位时,每个外设始终都是关闭的

//PH10配置为输出

//Q1:清零 ?ANS:与零与

//Q2:置1 ? ANS:与1或 :如果是两位,则操作受原来该位数据影响(假如两位为10,想要变成01,那么单纯的10与01相或不能时结果变为01.),所以为了实现置1操作,先清零,再与1或。

//总结:

将寄存器的某一位eg:GPIOH_ODR清零,与该位与0相与GPIOH_ODR &= ~(1<<10),GPIOH_ODR置1,该位与1相或GPIOH_ODR |= (1<<10)。

将寄存器的某两位eg:GPIOH_MODER变为00时,即清零型, 将该两位与11或之后再取反

//   01时,即置1型, 将该两位清零GPIOH_MODER &= ~(3<<2*10),再与1左移X位的值相或。

//   10时,即置1型, 将该两位清零GPIOH_MODER &= ~(3<<2*10),再与1左移X位的值相或。

//   11时,即置1型, 将该两位清零GPIOH_MODER &= ~(3<<2*10),再与3左移X位的值相或。

GPIOH_MODER &= ~(3<<2*10);

GPIOH_MODER |= (1<<2*10);

//PH10输出低电平

GPIOH_ODR &= ~(1<<10); 

while(1);

}


void  SystemInit(void)

{

}


// 逻辑左移时,最高位丢失,最低位补0;

// 逻辑右移时,最高位补0,最低位丢失;

// 算术左移时,依次左移一位,尾部补0,最高的符号位保持不变。

// 算术右移时,依次右移一位,尾部丢失,符号位右移后,原位置上复制一个符号位;

// 循环左移时,将最高位重新放置最低位

// 循环右移时,将最低位重新放置最高位

// 1010100010101  逻辑左移一位结果为  0101000101010

// 逻辑右移一位结果为 0101010001010

// 算术左移一位结果为 1101000101010

// 算术右移一位结果为 1101010001010

// 循环左移一位结果为 0101000101011

// 循环右移一位结果为 1101010001010


//关于双重指针的问题:


 *(unsigned int*)(0x4002 1C14) = 0xFFFF;

 0x4002 1C14 在我们看来是 GPIOH 端口 ODR 的地址,但是在编译器看来,这只是一

个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,

把它转换成指针,即(unsigned int *)0x4002 1C14,然后再对这个指针进行 * 操作


/* 控制 GPIOH 引脚 10 输出低电平(BSRR 寄存器的 BR10 置 1) */

*(unsigned int *)GPIOH_BSRR |= (0x01<<(16+10));

 

/* 控制 GPIOH 引脚 10 输出高电平(BSRR 寄存器的 BS10 置 1) */

*(unsigned int *)GPIOH_BSRR |= 0x01<<10;


unsigned int temp;

/* 控制 GPIOH 端口所有引脚的电平(读 IDR 寄存器) */

temp = *(unsigned int *)GPIOH_IDR;


使用 (unsigned int *) 把 GPIOH_BSRR 宏的数值强制转换成了地址,然后再用

“*”号做取指针操作,对该地址的赋值,从而实现了写寄存器的功能。同样,读寄存器也

是用取指针操作,把寄存器中的数据取到变量里,从而获取 STM32 外设的状态


关键字:STM32  建库操作  点亮LED 引用地址:STM32笔记2:建库操作之点亮LED

上一篇:STM32 LED灯的另一种写法
下一篇:STM32CubeMX下按键模块控制PWM蜂鸣器模块

推荐阅读最新更新时间:2024-11-06 20:05

基于DSP和STM32的电液伺服控制器设计
引言 伺服控制系统大部分都采用传统的硬件结构,控制算法比较固定,而且也无法实现不同工况下的高性能控制算法,难以满足现代工业的需求。现阶段迫切需要研制一种智能型、具有高可靠性、控制性能更加优秀的电液伺服系统。基于DSP与STM32的智能型伺服控制器具有软硬件结合程度更加紧密、系统的智能化程度更高、可实现多种控制策略的优势。本系统从实际的需求出发,结合精确数字PID控制算法和Fuzzy控制算法自身的优势,组合成Fuzzy—PID控制算法,根据偏差的大小范围选择合适的控制算法进行调节。 本设计将两款工控芯片——TI公司的浮点型DSPTMS320F28335和ST公司的ARM7升级版STM32F103RET6引入智能电液伺服系统,设计
[单片机]
基于DSP和<font color='red'>STM32</font>的电液伺服控制器设计
STM32连接射频si4438模块
SI4438射频模块参数: 1、频率范围:425-525MHz 2、数字接收信号强度指示(RSSI) 3、64字节收发数据寄存器(FIFO) 4、跳频功能 等! 使用SI的WDS工具生成代码 1、 选择仿真模式 2、芯片选择si4438 B1模式 3、 Radio Configuration Application 4、 Select Application 1、 Select Project 选择Bidirectional packet ,双向通信模式 2、 Configure project 配置工程 Frequency and power: 频率和功率的设置, ba
[单片机]
STM32 FreeModbus RTU从机移植以及UART配置
FreeModbus的具体介绍就不提了。至于为什么要移植,大概就是因为移植比较快,而且比较稳定,可以减少因为自己编写出现的漏洞。 但是FreeModbus 1.5版本是没有主机的,因此移植的时候只可以做从机。网上有几个关于Modbus主机的源代码,回头等我弄好了再更新。 ================================== 理论上来说,此处我移植了全部,但是只调试了RTU部分,因此其他部分不做赘述。 移植过程: 1.将modbus目录下所有文件拷贝加入工程。 2.对modbus中的include下的mbconfig.h进行编辑,裁剪其中需要的模块。(此处我没有进行裁剪,因此选项都是默认) 3.将
[单片机]
<font color='red'>STM32</font> FreeModbus RTU从机移植以及UART配置
关于STM32中断向量表的位置 、重定向问题
首先我们需要跳到main函数,这个就不多说了。那么,中断发生后,又是怎么跑到中断入口地址的呢? 从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如: AREA RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000) EXPORT __Vectors IMPORT OS_CPU_SysTickHandler IMPORT OS_CPU_PendSVHandler __Vectors DC
[单片机]
关于<font color='red'>STM32</font>中断向量表的位置 、重定向问题
STM32--UART异步通信学习
字符发送的过程描述:在UART的发送过程中先将数据输入到发送数据寄存器中(TDR)此时(TXE)被硬件置1,之后TDR寄存器将数据串行移入到发送移位寄存器中,将数据在TX端口发送,此时(TC)被硬件置1。 发送与接收是逆过程。 UART发送配置步骤: 1.通过USART_CR1寄存器上置位UE来激活USART。 2.编程USART_CR1的M位来定义字长。 3.在USART_CR2中编程停止位的位数。 4.如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。 5.利用USART_BRR寄存器选择要求的波特率。 6. 设
[单片机]
max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)
1、STM32 硬件SPI max7219 8位数码管显示模块 数码管模块电路图 /***************************************************************** Updated time: 12th,12,2015 Function:通过MAX7219驱动数码管 ******************************************************************/ #include “delay.h” #include “sys.h” #include “usart.h”//串口通信 #define Max7219_pinCLK PAout(
[单片机]
max7219驱动数码管程序(51单片机+<font color='red'>STM32</font> MAX7219数码管程序案例)
STM32之Systick(系统时钟&滴答定时器)
Systick(系统)定时器 Systick定时器是一个简单定时器,就是系统滴答定时器,可以用来做延时或者系统的心跳时钟 Systick有两个可选的时钟源,一个是外部时钟STCLK,等于HCLK/8,一个是内部时钟HCLK //使用外部时钟 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//使用外部时钟,时钟源为HCLK的8分频 //例如外部晶振为8MHz,倍频到72MHz,那么HCLK为72MHz,Systick时钟为9MHz //也就是说,Systick的计数器VAL每减1,时间就过了1/9us 假若选择HCLK,且HCLK频率为72MHz的话,系统时钟周
[单片机]
stm32快速入门
stm32简单描述:stm32基于ARM cortex-m3(m4)架构。官方已经提供完备的片内私有外设及片内外设的函数库。非常有利于利用C语言开发。 准备工作: 1、仔细阅读以下资料的相关章节: 1)cortex-m3权威指南 这是本cortex-m3架构的经典书,通俗易懂。开始阅读可重点关注存储结构等。 2)零死角玩转STM32 很好的入门教程,注意里面相关内容: A、LibrariesCMSISCoreCM3startuparm下有些启动文件,对应不同芯片,注意选择。 3)cortex-m3汇编启动代码分析 4) stm32固件库详解 PPP代表任一外设。 头文年的
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved