本文目录一览:
- 1、各位高手! 请指点 :我在学习 STM32 时遇到的问题:我的环境是 IAR ;
- 2、请问STM32程序中的这几个头文件,各有什么作用?
- 3、如何使用备份SRAM的EEPROM中STM32F4
- 4、stm32程序在插上串口线可以进行调试,程序正常运行(程序有指示灯),拔掉串口线程序就不运行了,求指点!
- 5、stm32有没有用isp方式升级程序的,go命令怎么不好用
- 6、stm32搜索不到函数
各位高手! 请指点 :我在学习 STM32 时遇到的问题:我的环境是 IAR ;
你先跳转到你用到RCC_PLLSource_HSE_Div1的地方,然后右击go to definition xxxxx,看看能不能找到该变量的定义吧。工程中要加入stm32f10x_rcc.c文件,而且在stm32f10x_conf.h(或是
stm32f10x.h依库版本而定)文件中将/*#include stm32f10x_rcc.h*/的注释去掉。
有时候后面提示的错误有可能是因为前面引起的。
请问STM32程序中的这几个头文件,各有什么作用?
都是.c文件,不是头文件啊。stm32f10x_it.c 中断处理函数都放在这个文件里面。main.c 这个不用解释了吧stm32f10x.h 这个是头文件,它包含了stm32的一些常用宏,寄存器结构体的定义,高版本的库还放着中断向量表。stm32f10x_rcc.c 这个文件里的固件函数包含了一些对复位、时钟的控制的函数stm32f10x_gpio.c这个文件里的固件函数包含了对GPIO的操作函数stm32_eval.c 这个是st公司为其制作的评估板写的程序system_stm32f10x.c主要包含了对系统时钟设置,一般是对倍频时钟的设置 具体可以看一下文件内容啊,呵呵 欢迎追问 追问: 您好,非常感谢您!我是刚刚学习STM32。我还有几个问题。
三、GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
u8 count=0;
四、void Delay(vu32 nCount);
希望您能帮助我,我会给您高分的。 回答: 1、因为引脚本来就是16个的啊,从pin0~pin15,GPIOA口有16个脚,GPIOB也有16个,GPIOC也有16个,是这样区分的,它是相对于一组io口的细分,ALL来代替的是选中了这一组io 2、不可以,呵呵你要选择到底是GPIOA还是GPIOB还是...C还是...D等等的GPIO_Pin_03、GPIO_InitTypeDef、ErrorStatus是两个结构体,u8是定义的unsigned char你可以通过keil的go to definition选项找到它们的定义,这个是标准C的定义 4、不是,这两个是函数。你的C语言基础太差,估计很多都看不懂吧,呵呵,建议先补习一下C语言 欢迎追问 追问: 嗯,是的C语言基础不太好,以前学单片机主要是用汇编。
如何使用备份SRAM的EEPROM中STM32F4
1.必须做到如下: 启用压水堆时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
能够访问到备份域
PWR_BackupAccessCmd(ENABLE);
启用备份SRAM时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
启用备份SRAM的低功耗稳压器,以保持它在VBAT模式的内容
PWR_BackupRegulatorCmd(ENABLE);
你可以读/写数据,建立SRAM(从STM32F4xx_DSP_StdPeriph_Lib BKP_Domain代码这些代码)(在我的MCU stm32f417 BKPSRAM_BASE=0x40024000)
// Write to Backup SRAM with 32-Bit Data
for (i = 0x0; i 0x100; i += 4) {
*(__IO uint32_t *) (BKPSRAM_BASE + i) = i;
}
// Check the written Data
for (i = 0x0; i 0x100; i += 4) {
if ((*(__IO uint32_t *) (BKPSRAM_BASE + i)) != i){
errorindex++;
}
}
那么,如果你想 //等到备份SRAM的低功耗稳压器已准备就绪
while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET)
{}
你可以在STM32F4xx_DSP_StdPeriph_Lib找到这些函数。
2. 通过参考手册STM32F4和stm32f405xx / stm32f407xx书看完后,我同意这是不清楚如何备份SRAM(或所在)。下面是我发现。无论是RTC寄存器和备份SRAM包含存储的,只要你有电池电量维持量。该RTC含有20寄存器(80字节)和备份SRAM(这是它自己的周缘上AHB1和位于寄存器地址区域内)包含为0x1000(4096字节)。无论是默认启用的。 在DM00037051(stm32f405xx / stm32f407xx数据,P29):
The 4-Kbyte backup SRAM is an EEPROM-like memory area. It can be used to store
data which need to be retained in VBAT and standby mode. This memory area is
disabled by default to minimize power consumption (see Section 2.2.19:
Low-power modes). It can be enabled by software.
The backup registers are 32-bit registers used to store 80 bytes of user
application data when VDD power is not present. Backup registers are not reset
by a system, a power reset, or when the device wakes up from the Standby mode
(see Section 2.2.19: Low-power modes).
数据表71页参考手册和p65在
AHB1 | 0x4002 4000 - 0x4002 4FFF | BKPSRAM
和参考手册的datatasheet和P67的第73页
APB1 | 0x4000 2800 - 0x4000 2BFF | RTC BKP Registers
页面上启用备份SRAM和RTC寄存器参考手册118-119。 注意:如果你是RTC的备份域 CodeGo.net,只需要存储和LT=80个字节,那么你最好的支持RTC寄存器启用备份SRAM基本上会加倍消耗电流(参见stm32f405 / 7数据表25 )。 这里是我的写入和读取用于备份SRAM和备份函数的RTC寄存器
int8_t write_to_backup_sram( uint8_t *data, uint16_t bytes, uint16_t offset ) {
const uint16_t backup_size = 0x1000;
uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE;
uint16_t i;
if( bytes + offset = backup_size ) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
}
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
/* disable backup domain write protection */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // set RCC-APB1ENR.pwren
PWR_BackupAccessCmd(ENABLE); // set PWR-CR.dbp = 1;
/** enable the backup regulator (used to maintain the backup SRAM content in
* standby and Vbat modes). NOTE : this bit is not reset when the device
* wakes up from standby, system reset or power reset. You can check that
* the backup regulator is ready on PWR-CSR.brr, see rm p144 */
PWR_BackupRegulatorCmd(ENABLE); // set PWR-CSR.bre = 1;
for( i = 0; i bytes; i++ ) {
*(base_addr + offset + i) = *(data + i);
}
PWR_BackupAccessCmd(DISABLE); // reset PWR-CR.dbp = 0;
return 0;
}
int8_t read_from_backup_sram( uint8_t *data, uint16_t bytes, uint16_t offset ) {
const uint16_t backup_size = 0x1000;
uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE;
uint16_t i;
if( bytes + offset = backup_size ) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
}
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
for( i = 0; i bytes; i++ ) {
*(data + i) = *(base_addr + offset + i);
}
return 0;
}
int8_t write_to_backup_rtc( uint32_t *data, uint16_t bytes, uint16_t offset ) {
const uint16_t backup_size = 80;
volatile uint32_t* base_addr = (RTC-BKP0R);
uint16_t i;
if( bytes + offset = backup_size ) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
} else if( offset % 4 || bytes % 4 ) {
/* ERROR: data start or num bytes are not word aligned */
return -2;
} else {
bytes = 2; /* divide by 4 because writing words */
}
/* disable backup domain write protection */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // set RCC-APB1ENR.pwren
PWR_BackupAccessCmd(ENABLE); // set PWR-CR.dbp = 1;
for( i = 0; i bytes; i++ ) {
*(base_addr + offset + i) = *(data + i);
}
PWR_BackupAccessCmd(DISABLE); // reset PWR-CR.dbp = 0;
// consider also disabling the power peripherial?
return 0;
}
int8_t read_from_backup_rtc( uint32_t *data, uint16_t bytes, uint16_t offset ) {
const uint16_t backup_size = 80;
volatile uint32_t* base_addr = (RTC-BKP0R);
uint16_t i;
if( bytes + offset = backup_size ) {
/* ERROR : the last byte is outside the backup SRAM region */
return -1;
} else if( offset % 4 || bytes % 4 ) {
/* ERROR: data start or num bytes are not word aligned */
return -2;
} else {
bytes = 2; /* divide by 4 because writing words */
}
/* read should be 32 bit aligned */
for( i = 0; i bytes; i++ ) {
*(data + i) = *(base_addr + offset + i);
}
return 0;
}
3. 我是一个STM32F2xx微控制器。根据数据表: 4 KB的备份SRAM是EEPROM般的区域。 保留的RTC备份寄存器的内容......当VDD关闭时,VBAT引脚可以连接到由电池或由另一个源提供的可选的备份电压。 甲超级电容器,例如,将需要而在微控制器的电源关闭,以保持备份寄存器的内容。 此外,根据本 复位后,备份域(...备份SRAM)进行保护,防止可能有害的写访问。要允许访问备份域,请执行以下操作... 它为您提供了有关如何访问到备份域通过直接写入到某些外设寄存器指令。如果你有机会到STM32F4xx库,你可以这样调用(注意:我的STM32F2xx库):
PWR_BackupAccessCmd(ENABLE);
注:还有更多的是它不是简单地调用上面的函数,如启用备份SRAM接口时钟。咨询STM32F4系列 有很多嵌入的库源是无价的,如果它是可用的,应阅读。 在STM32F2系列微控制器,SRAM位于地址范围: 0x40024000-0x40024FFF 并且可以被写入到在位置,例如,如下所示:
#define VAR_LOC ((volatile uint8_t *)(0x40024000))
volatile uint8_t *pVar = VAR_LOC;
*pVar = 5;
stm32程序在插上串口线可以进行调试,程序正常运行(程序有指示灯),拔掉串口线程序就不运行了,求指点!
首先,你在
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}
里面设置一个断点,看程序运行的时候会不会进去,进去则说明你的程序逻辑上有问题,有可能是数组越界之类的错误;
其次,如果没有进去,你需要量一下boot0和boot1的电平,看是不是正常的flash内启动模式。
我之前也遇见过类似的问题,发现时开发板上boot前的一个三极管击穿了所以导致启动模式不对,希望对你有所帮助!
stm32有没有用isp方式升级程序的,go命令怎么不好用
boot0 = 1 boot1 = 0是二个不同的IO控制位,用来选择从哪里启动的。这都不知道应该打自己二板子ISP下载 就是用串口下载 可以不用RTS DTR 功能
stm32搜索不到函数
rebuild the target!
project 选项里有个 rebuild all 选项
重新rebuild 之后等下面的绿色进度条走完 就能找到了