stm32st-link无法初始化设备解决方法:
1、开启时钟。
2、初始化GPIO结构体(包括8个LED和锁存器)PC8~PC15、PD2。
3、写一个控制LED的函数。
4、定义一个LED的全局变量即可初始化。
,模块如下:
1
把工程项目模板重新复制一份,改名为“点亮一个LED灯”
在USR文件夹下创建led文件夹
led文件夹下面新建以下两个文件
bsp_led.c
bsp_led.h
2
然后我们用keil打开这个工程项目
点击如下图圈上的图标
3
新建一个led文件夹
然后我们把刚新建的文件导入到led文件夹
4
在bsp_led.h文件里
#ifndef __BSP_LED_H__
#define __BSP_LED_H__
#include "stm32f10x.h"
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_PIN GPIO_Pin_5
void LED_GPIO_Config(void);
#endif
5
在bsp_led.c文件里
#include "./led/bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//打开外设时钟
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK,ENABLE);
//配置初始化结构体
GPIO_InitStruct.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
//调用外设初始化函数,把配置好的结构体成员写到寄存器里面
GPIO_Init(LED1_GPIO_PORT,GPIO_InitStruct);
}
6
在main.c文件里
#include "./led/bsp_led.h"
void delay(uint32_t count);
int main(void)
{
LED_GPIO_Config();
while(1)
{
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
delay(0xfffff);
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
delay(0xfffff);
}
}
void delay(uint32_t count)
{
for (;count!=0;count--);
}
根据你这个norflash的datasheet来计算,里面有详细时序图。
请看此文档:
第一张图是read cycle timing,读取norflash的内容。
第二张图是program/erase cycle timing,写数据 / 擦除时间,你可以看到这个里面AddressSetupTime,AddressHoldTime,DataSetupTime等都有一个最小时间限制,例如AddressHoldTime是30ns,那么你给这个芯片的AddressHoldTime就不能小于30ns,小于30ns的话很可能会导致传输出错。然后在STM32里面这个数值具体是多少和你配置的主频、fsmc速度等等有关系。你可以以ST的AN2784 Application note作为参考,去计算一个准确的值。
AN2784 Application note:
看这个文档需要点耐心,参数比较多。
其实你也不用一一计算,很麻烦,可以走走捷径,你首先可以把数值都调大一点,因为这个时间小了的话norflash可能不能够识别,所以调大肯定能够识别。待norflash能够正确读取之后,把之间参数改小,改到不能正确读取的时候为止,那么此时就是临界值了。我平时是这么做的,尤其是用FSMC驱动液晶屏,我觉得这种方法很好,个人观点,希望对你有用。
本文标签:stm32调用初始化结构体