[STM32F10x] 标准库初始化问题

  硬件:STM32F103C8T6

  平台:ARM-MDK V5.11

  STM32F系列提供的标准库都是通过结构体来初始化的。比如,以下是GPIO初始化的一个示例代码:

  GPIO_InitTypeDef   GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_0 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  先定义一个初始化结构体变量,然后根据实际需求给结构体里面的元素赋值,最后调用初始化函数,开始初始化。

  我一般喜欢把这个结构体定义为局部变量,因为初始化过程一般只调用一次,问题就来了。

  这是我在使用TIM1定时器时遇到的一个问题,本想使用TIM1产生一个8us的定时,可是产生的却是1ms的定时。TIM1定时器初始化的代码如下:

void TimeBaseConfig(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    TIM_TimeBaseStructure.TIM_Period            = 575;
    TIM_TimeBaseStructure.TIM_Prescaler         = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision     = 0;
    TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;
    TIM_TimeBaseInit(EM4095_TIMEBASE, &TIM_TimeBaseStructure);

    TIM_ARRPreloadConfig(EM4095_TIMEBASE, ENABLE);

    /* TIM1 enable counter */
    TIM_Cmd(EM4095_TIMEBASE, ENABLE);

    /* Update interrupt config */
    TIM_ITConfig(EM4095_TIMEBASE, TIM_IT_Update, ENABLE);
}

  问题就出在初始化结构定义的位置!运行时,查看这个结构体的值:

  

  由于定义为局部变量,初始化结构体里面的元素的值是随机的,而我的初始化函数里也少了TIM_RepetitionCounter赋值,本来该值应设为0,结果初始值为0x80,

  即重复128次才产生一个定时中断,大概是1ms。

  假如初始化结构体定义为全局变量:

  

  可以看到,结构体定义为全局变量时,所有值都初始化为0.

  结论

  虽然初始化结构定义为全局变量后,每个元素都会初始化为0,但并不一定是你需要的值。因此对外设进行初始化时,结构体中的每一个元素都要根据

  实际需求赋值。

/×××××××××××××××××××××××××××××××××××××××× THE END ×××××××××××××××××××××××××××××××××××××××/

时间: 2024-08-23 18:25:20

[STM32F10x] 标准库初始化问题的相关文章

[STM32F10x] 从零开始创建一个基于标准库的工程

硬件:STM32F103C8T6 平台:MDK-AMR V4.70 1.创建一个Keil uVision 的工程 要点:相同类型的源文件放在一起以便于管理       2.添加标准库源文件 3.添加几个必要的源文件 包括: core_cm3.c stm32f10x_it.c system_stm32f10x_it.c stm32f10x_conf.h 4.指定头文件路径 5.添加必要的预处理标志 本例为 USE_STDPERIPH_DRIVER, STM32F10X_MD 6.添加一个main函

单片机stm32零基础入门之--初识STM32 标准库

CMSIS 标准及库层次关系 因为基于Cortex 系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些差异却导致软件在同内核,不同外设的芯片上移植困难.为了解决不同的芯片厂商生产的Cortex 微控制器软件 的兼容性问题,ARM 与芯片厂商建立了CMSIS 标准(CortexMicroController Software Interface Standard). 所谓CMSIS 标准,实际是新建了一个软件抽象层. CMSIS 标准中最主要的为CMSIS 核心层,它包括了: 内核

3.2 标准库类型string(上)

#include <string> #include <iostream> using std::string; using std::cin; using std::cout; using std::endl; //string定义在命名空间std中 int main() { /**************3.2.1 定义和初始化string*****************/ string s1; //默认初始化,S1是一个空字符串 string S2 = s1; //S2时S

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin

第三章:标准库类型

1:标准库函数,类名等都在std命名空间中:有些类型名或函数在类里面的头文件中,故而通过头文件可以得到,或者通过“类::”得到.而很多c++的标准库中类名,不仅仅是添加头文件,还需要加std::. 2:关于c与c++的头文件区别:c的标准库都是用.h命名的,而c++是没有的:对于兼容c则c++通过cXXX来表示了,例如stdio.h就是cstdio.标准库中的头文件通过<>;非标准的用””. 3:<>和””是用于指出寻找函数,或者类等的初始路劲.用<>表示从系统的路径找

【python标准库学习】thread,threading(一)多线程的介绍和使用

在单个程序中我们经常用多线程来处理不同的工作,尤其是有的工作需要等,那么我们会新建一个线程去等然后执行某些操作,当做完事后线程退出被回收.当一个程序运行时,就会有一个进程被系统所创建,同时也会有一个线程运行,这个线程就是主线程main,在主线程中所创建的新的线程都是子线程,子线程通常都是做一些辅助的事.python中提供了thread和threading两个模块来支持多线程. python中使用线程有两种方式,第一种是用thread模块的start_new_thread函数,另一种是用threa

Golang中使用log(一):Golang 标准库提供的Log

Golang的标准库提供了log的机制,但是该模块的功能较为简单(看似简单,其实他有他的设计思路).不过比手写fmt. Printxxx还是强很多的.至少在输出的位置做了线程安全的保护.其官方手册见Golang log (天朝的墙大家懂的).这里给出一个简单使用的例子: package main import ( "log" ) func main(){ log.Fatal("Come with fatal,exit with 1 \n") } 编译运行后,会看到程

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很