A" />
文档库 最新最全的文档下载
当前位置:文档库 › STM32各种函数的基本配置

STM32各种函数的基本配置

STM32各种函数的基本配置
STM32各种函数的基本配置

STM32各种函数的基本配置(功能是摄像头采集数据SD存储)

/*

#include "stm32f4_discovery.h"

#include "stm32f4xx_conf.h"

uint32_t Gb_TimingDelay;

void Delay(uint32_t nTime);

void main( )

{

SysTick_Config(SystemCoreClock / 1000); //设置systemtick 一毫秒中断 RCC->AHB1ENR |= 0x00000008; //使能GPIOD 时钟

RCC->APB2ENR |= (1<<14); //使能syscfg 时钟

GPIOD->MODER &= 0x00FFFFFF; //设置PD12,13,14,15 输出

GPIOD->MODER |= 0x55000000;

GPIOD->OTYPER &= 0xFFFF0FFF; //设置PD12,13,14,15 推挽输出

GPIOD->OSPEEDR &= 0x00FFFFFF; //PD12,13,14,15 速度100m

GPIOD->OSPEEDR |= 0xff000000;

SYSCFG->CMPCR = 0x00000001; //使用IO 补偿单元,

//当GPIO 速度超过50M 的时候要考虑使用此设置

GPIOD->PUPDR &= 0x00FFFFFF; //PD12,13,14,15 无上拉无下拉

GPIOD->BSRRH = 0xf000; //reset register GPIOx_BSRRH, write only //set register GPIOx_BSRRL, write only

while(1)

GPIOD->BSRRH = 0xf000;

GPIOD->BSRRL = 0x1000;

Delay(100);

GPIOD->BSRRH = 0xf000;

GPIOD->BSRRL = 0x1000<<1; Delay(100);

GPIOD->BSRRH = 0xf000;

GPIOD->BSRRL = 0x1000<<2; Delay(100);

GPIOD->BSRRH = 0xf000;

GPIOD->BSRRL = 0x1000<<3; Delay(100);

}

}

void Delay(uint32_t nTime)

{

Gb_TimingDelay = nTime;

while(Gb_TimingDelay != 0);

}

void SysTick_Handler(void)

{

if (Gb_TimingDelay != 0x00)

{

Gb_TimingDelay--;

}

}

*/

#include "stm32f4_discovery.h"

#include "stm32f4xx_conf.h"

uint32_t Gb_TimingDelay;

void Delay(uint32_t nTime);

void main( )

{

SysTick_Config(SystemCoreClock / 1000); //设置systemtick 一毫秒中断

//-------------------------------------

GPIO_InitTypeDef GPIO_InitStructure;

//Enable the GPIO_LED Clock

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

//Configure the GPIO_LED pin

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

//点亮这个灯

GPIOD->BSRRL = GPIO_Pin_12;

while(1)

{

//

//GPIOD->ODR ^= GPIO_Pin_12;

//GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); GPIO_ToggleBits(GPIOD, GPIO_Pin_12);

//Insert a delay

Delay(10);

}

}

void Delay(uint32_t nTime)

{

Gb_TimingDelay = nTime;

while(Gb_TimingDelay != 0);

}

void SysTick_Handler(void)

{

if (Gb_TimingDelay != 0x00)

{

Gb_TimingDelay--;

}

}

*/

/*

#include "stm32f4_discovery.h"

#include "stm32f4xx_conf.h"

#include "stm32f4xx_rcc.h"

uint32_t xiande=0;

uint32_t Gb_TimingDelay;

void Delay(uint32_t nTime);

void main( )

{

//Configure the system clocks

RCC_ClocksTypeDef RCC_Clocks;

//SysTick end of count event each 10ms

SysTick_Config(SystemCoreClock / 1000); //设置systemtick 一毫秒中断

//Initialize LEDs mounted on STM32F4-Discovery board

STM_EVAL_LEDInit(LED4);

STM_EVAL_LEDInit(LED3);

STM_EVAL_LEDInit(LED5);

STM_EVAL_LEDInit(LED6);

//Turn on LED4 and LED5

STM_EVAL_LEDOn(LED4);

STM_EVAL_LEDOn(LED5);

RCC_GetClocksFreq(&RCC_Clocks);

xiande = RCC_Clocks.SYSCLK_Frequency;

xiande = RCC_Clocks.HCLK_Frequency;

xiande = RCC_Clocks.PCLK1_Frequency;

xiande = RCC_Clocks.PCLK2_Frequency;

while(1)

{

//Toggle LED3 and LED6

STM_EVAL_LEDToggle(LED3);

STM_EVAL_LEDToggle(LED6);

//Insert a delay

Delay(10);

}

}

void Delay(uint32_t nTime)

{

Gb_TimingDelay = nTime;

while(Gb_TimingDelay != 0);

}

void SysTick_Handler(void)

{

if (Gb_TimingDelay != 0x00)

{

Gb_TimingDelay--;

}

}

*/

#include "stm32f4_discovery.h"

#include "stm32f4xx_conf.h"

#include "stm32f4xx_rcc.h"

/*定义USART6接受的数据存储变量*/

uint16_t usart6_get_data;

uint32_t Gb_TimingDelay;

void Delay(uint32_t nTime);

void GPIO_Config(void);

void USART_Config(void);

void USART6_Puts(char * str);

void NVIC_Config(void);

void Delay(uint32_t nCount);

void main()

{

/*在主函数main之前通过调用启动代码运行了SystemInit函数,而这个函数位于system_stm32f4xx.c”。

程序运行起始于启动文件的第175行(LDR R0, =SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,

定义HSE为25M,则sys时钟频率为168M */

SysTick_Config(SystemCoreClock / 1000); //设置systemtick 一毫秒中断

//GPIO_Config();

USART_Config();

NVIC_Config();

STM_EVAL_LEDInit(LED3);

STM_EVAL_LEDInit(LED4);

STM_EVAL_LEDInit(LED5);

STM_EVAL_LEDInit(LED6);

//Turn on LED4 and LED5

STM_EVAL_LEDOn(LED3);

while (1)

{

STM_EVAL_LEDOff(LED3); //setbits使能IO,当前下指输出(此时为灭)

Delay(100);

STM_EVAL_LEDToggle(LED4);

STM_EVAL_LEDToggle(LED5);

STM_EVAL_LEDToggle(LED6);

/*以下为查询方式

USART6_Puts("Hello Wrold!\n");

GPIO_ResetBits(GPIOG,GPIO_Pin_6); //Resetbits屏蔽IO,当前下指不输出(此时为亮)

Delay(0xFFFFFF);

while (USART_GetFlagStatus(USART6,USART_FLAG_RXNE) == RESET){ }

//usart6_get_data = USART_ReceiveData(USART6);

USART6_Puts("Get Data From USART6:");

USART_SendData(USART6,USART_ReceiveData(USART6));

while (USART_GetFlagStatus(USART6, USART_FLAG_TXE) == RESET){ }

//USART6_Puts(&usart6_get_data);

USART6_Puts("\r\n"); */

}

}

/************************************************* Function: void Delay(uint32_t nCount)

Description: 延时函数

Input: 延时的时间

Output:无

Return:无

*************************************************/

void Delay(uint32_t nTime)

{

Gb_TimingDelay = nTime;

while(Gb_TimingDelay != 0);

}

void SysTick_Handler(void)

{

if (Gb_TimingDelay != 0x00)

{

Gb_TimingDelay--;

}

}

/************************************************* Function: void GPIO_Config(void)

Description: GPIO配置函数

Input: 无

Output:无

Return:无

*************************************************/

void GPIO_Config(void)

{

/*定义了一个GPIO_InitStructure的结构体,方便一下使用 */

GPIO_InitTypeDef GPIO_InitStructure;

/* 初始化GPIOG时钟*/

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG , ENABLE);//使能GPIOG时钟(时钟结构参见“stm32图解.pdf”)

/*仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数

PPP_SturcInit(..)

来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他

成员的值(多为缺省值)被正确填入。

*/

GPIO_StructInit(&GPIO_InitStructure);

/* 初始化GPIOG的Pin_6为推挽输出*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //指定第六引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式为输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //频率为快速

GPIO_Init(GPIOG, &GPIO_InitStructure); //调用IO初始化函数

}

/*************************************************

Function: void USART_Config(void)

Description: USART配置函数

Input: 无

Output:无

Return:无

*************************************************/

void USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

USART_ClockInitTypeDef USART_ClockInitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); //开启USART6时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //开启GPIOC时钟

GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);//这相当于M3的开启复用时钟?只配置复用的引脚,

GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);//

/* Connect USART pins to AF7 */

/*配置GPIOC*/

GPIO_StructInit(&GPIO_InitStructure); //缺省值填入

/*配置GPIOC_Pin6为TX输出*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //设置为复用,必须为AF,OUT不行

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure);

/*配置GPIOC_Pin7为RX输入*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //这也必须为复用,与M3不同!

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure);

/*IO引脚复用功能设置,与之前版本不同*/

/*配置USART6*/

USART_StructInit(&USART_InitStructure);

USART_https://www.wendangku.net/doc/2614518319.html,ART_BaudRate =115200;

USART_https://www.wendangku.net/doc/2614518319.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.wendangku.net/doc/2614518319.html,ART_StopBits = USART_StopBits_1;

USART_https://www.wendangku.net/doc/2614518319.html,ART_Parity = USART_Parity_No;

USART_https://www.wendangku.net/doc/2614518319.html,ART_HardwareFlowControl =

USART_HardwareFlowControl_None;

USART_https://www.wendangku.net/doc/2614518319.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART6, &USART_InitStructure);

USART_ClockStructInit(&USART_ClockInitStruct); //之前没有填入缺省值,是不行的

USART_ClockInit(USART6, &USART_ClockInitStruct);

USART_ITConfig(USART6, USART_IT_RXNE, ENABLE); //使能 USART6中断

USART_Cmd(USART6, ENABLE); //使能 USART6

}

void NVIC_Config()

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //嵌套优先级分组为 1

NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; //嵌套通道为

USART6_IRQn

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为 0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道中断使能

NVIC_Init(&NVIC_InitStructure);

}

/*************************************************

Function: void USART6_Puts(char * str)

Description: USART6发送数据

Input: 待发送数据指针

Output:无

Return:无

*************************************************/

void USART6_Puts(char * str)

{

while (*str)

{

USART_SendData(USART6, *str++);

/* Loop until the end of transmission */

while (USART_GetFlagStatus(USART6, USART_FLAG_TXE) == RESET); //详见英文参考的521页,当TXE被置起时,一帧数据传输完成

}

}

/**名称:USART6中断服务程序

*作用:USART6收到数据后产生中断,并将收到的内容发回给上位机

*/

void USART6_IRQHandler(void)

{

if (USART_GetITStatus(USART6, USART_IT_RXNE) != RESET) //判断为接收中断 {

USART_SendData(USART6, USART_ReceiveData(USART6)); //发送收到的数据 STM_EVAL_LEDOn(LED3); //点亮LED,起到中断指示作用

}

}

#include "stm32f4_discovery.h"

#include "stm32f4xx_conf.h"

#include "stm32f4xx_rcc.h"

#include

#include "stm32f4xx_spi.h"

#include "ff.h"

#include "diskio.h"

#include "SPI_MSD0_Driver.h"

#include "stm32f4xx_dcmi.h"

#include "stm32f4xx_i2c.h"

#include "dcmi_ov9655.h"

#include "camera_api.h"

#define Hang 120

#define Lie 160

//----

FATFS fs;

FRESULT res;

DIR dirs;

FIL file;

FILINFO finfo;

UINT br;

unsigned char txtBuf[200];

char spfline[30];

//-----

// Private typedef ----------------------------------------------------------- // Private define ------------------------------------------------------------ // Private macro ------------------------------------------------------------- // Private variables --------------------------------------------------------- RCC_ClocksTypeDef RCC_Clocks;

OV9655_IDTypeDef OV9655_Camera_ID;

uint8_t cameraBuf[40];

extern Camera_TypeDef Camera;

extern ImageFormat_TypeDef ImageFormat;

extern uint8_t ValueMax;

extern const uint8_t *ImageForematArray[];

//unsigned long int theMap[20000]={0};

unsigned char theMap[Hang*Lie*2]={0};

volatile unsigned char biaozhi=0;

volatile unsigned char biaozhi2=0;

volatile unsigned char DmaTransOver=0;

//-------

//定义USART6接受的数据存储变量

uint16_t usart6_get_data;

uint32_t Gb_TimingDelay;

//-----------------------------------------

//Function:

//Description:

//Input:

//Output:无

//Return:无

//--------------------------------------------

//-----------------------------------------

//Function: 系统通过uart用printf函数时,需要重载的函数

//Description:

//Input:

//Output:无

//Return:无

//--------------------------------------------

int fputc(int ch, FILE *f)

{

//Place your implementation of fputc here

//Loop until the end of transmission

while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

// write a character to the USART

USART_SendData(USART2, (uint8_t) ch);

return ch;

}

//-----------------------------------------

//Function: void Delay(uint32_t nCount) //Description: 延时函数

//Input: 延时的时间

//Output:无

//Return:无

//-------------------------------------------- void Delay(uint32_t nTime)

{

Gb_TimingDelay = nTime;

while(Gb_TimingDelay != 0);

}

void SysTick_Handler(void)

{

if (Gb_TimingDelay != 0x00)

{

Gb_TimingDelay--;

}

}

//-----------------------------------------

//Function: void GPIO_Config(void)

//Description: GPIO配置函数

//Input:

//Output:无

//Return:无

//--------------------------------------------

void GPIO_Config(void)

{

//定义了一个GPIO_InitStructure的结构体,方便一下使用

GPIO_InitTypeDef GPIO_InitStructure;

// 初始化GPIOG时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG , ENABLE);//使能GPIOG时钟(时钟结构参见“stm32图解.pdf”)

//仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数

PPP_SturcInit(..)

//来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他

//成员的值(多为缺省值)被正确填入。

GPIO_StructInit(&GPIO_InitStructure);

//初始化GPIOG的Pin_6为推挽输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //指定第六引脚

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式为输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //频率为快速

GPIO_Init(GPIOG, &GPIO_InitStructure); //调用IO初始化函数

}

//-----------------------------------------

//Function: void USART_Config(void)

//Description: USART配置函数

//Input:

//Output:无

//Return:无

//--------------------------------------------

void USART_Config(void)

{

//需要初始化的三个结构体

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

USART_ClockInitTypeDef USART_ClockInitStruct;

//------------------------------各种时钟配置

//----使能模块时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //开启USART6时钟

//----使能GPIO引脚时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

//------------------------------配置串口模块的功能

//---选择模块利用引脚

GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);//这相当于M3的开启复用时钟?只配置复用的引脚,

GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);

//------------------------------配置GPIOC引脚

//----缺省值填入

GPIO_StructInit(&GPIO_InitStructure);

//----配置GPIOC_Pin6为TX输出

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //设置为复用,必须为AF,OUT不行

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD,&GPIO_InitStructure);

//--------配置GPIOC_Pin7为RX输入

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //这也必须为复用,与M3不同!

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD,&GPIO_InitStructure);

//-----------------------------------------------

//IO引脚复用功能设置,与之前版本不同

//----------配置USART6

//---------------------缺省值填入

USART_StructInit(&USART_InitStructure);

USART_https://www.wendangku.net/doc/2614518319.html,ART_BaudRate =115200;

USART_https://www.wendangku.net/doc/2614518319.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.wendangku.net/doc/2614518319.html,ART_StopBits = USART_StopBits_1;

USART_https://www.wendangku.net/doc/2614518319.html,ART_Parity = USART_Parity_No;

USART_https://www.wendangku.net/doc/2614518319.html,ART_HardwareFlowControl =

USART_HardwareFlowControl_None;

USART_https://www.wendangku.net/doc/2614518319.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART2, &USART_InitStructure);

//--------缺省值填入

USART_ClockStructInit(&USART_ClockInitStruct);

USART_ClockInit(USART2, &USART_ClockInitStruct);

//配置中断,使能相应模块

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能 USART6中断

STM32固件库的学习(重要,要常看)

1. stm32的编程中,在stdperiph_drive中添加的misc.c文件是干什么用的啊? 因为STM32 V3.5版本的库函数中没有原来版本中单独对于NVIC(中断向量嵌套)的外设驱动,把NVIC的外设驱动放在了misc.c中,实际上是代替原来的stm32f10x_nvic.c。 2. STM32F10XXX V 3.5标准外设库文件夹描述 标准外设库的第一部分是CMSIS 和STM32F10x_StdPeriph_Driver,CMSIS 是独立于供应商的Cortex-M处理器系列硬件抽象层,为芯片厂商和中间件供应商提供了简单的处理器软件接口,简化了软件复用工作,降低了Cortex-M上操作系统的移植难度,并减少了新入门的微控制器开发者的学习曲线和新产品的上市时间。 STM32F10x_StdPeriph_Driver则包括了分别对应包括了所有外设对应驱动函数,这些驱动函数均使用C语言编写,并提供了统一的易于调用的函数接口,供开发者使用。Project 文件夹中则包括了ST官方的所有例程和基于不同编译器的项目模板,这些例程是学习和使用STM32的重要参考。Utilities包含了相关评估板的示例程序和驱动函数,供使用官方评估板的开发者使用,很多驱动函数同样可以作为学习的重要参考。 3.文件功能说明

4.CMSIS文件夹结构

在实际开发过程中,根据应用程序的需要,可以采取2种方法使用标准外设库

(StdPeriph_Lib): (1)使用外设驱动:这时应用程序开发基于外设驱动的API(应用编程接口)。用户只需要配置文件”stm32f10x_conf.h”,并使用相应的文件”stm32f10x_ppp.h/.c”即可。 (2) 不使用外设驱动:这时应用程序开发基于外设的寄存器结构和位定义文件。 5. STM32F10XXX标准外设库的使用 标准外设库中包含了众多的变量定义和功能函数,如果不能了解他们的命名规范和使用规律将会给编程带来很大的麻烦,本节将主要叙述标准外设库中的相关规范,通过这些规范的学习可以更加灵活的使用固件库,同时也将极大增强程序的规范性和易读性,同时标准外设库中的这种规范也值得我们在进行其他相关的开发时使用和借鉴。 a.缩写定义 标准外设库中的主要外设均采用了缩写的形式,通过这些缩写可以很容易的辨认对应的外设。

stm32入门C语言详解

阅读flash:芯片内部存储器flash操作函数我的理解——对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。 基础应用1,FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。所有程序中必须的 用法:FLASH_SetLatency(FLASH_Latency_2); 位置:RCC初始化子函数里面,时钟起振之后。 基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的 用法:FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 位置:RCC初始化子函数里面,时钟起振之后。 3、阅读lib:调试所有外设初始化的函数。 我的理解——不理解,也不需要理解。只要知道所有外设在调试的时候,EWRAM需要从这个函数里面获得调试所需信息的地址或者指针之类的信息。 基础应用1,只有一个函数debug。所有程序中必须的。 用法:#ifdef DEBUG debug(); #endif 位置:main函数开头,声明变量之后。 4、阅读nvic:系统中断管理。 我的理解——管理系统内部的中断,负责打开和关闭中断。 基础应用1,中断的初始化函数,包括设置中断向量表位置,和开启所需的中断两部分。所有程序中必须的。 用法:void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; //中断管理恢复默认参数 #ifdef VECT_TAB_RAM //如果C/C++ Compiler\Preprocessor\Defined symbols中的定义了 VECT_TAB_RAM(见程序库更改内容的表格) NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //则在RAM调试 #else //如果没有定义VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//则在Flash里调试 #endif //结束判断语句 //以下为中断的开启过程,不是所有程序必须的。 //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC优先级分组,方式。 //注:一共16个优先级,分为抢占式和响应式。两种优先级所占的数量由此代码确定, NVIC_PriorityGroup_x可以是0、1、2、3、4,分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在其中选择,抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。 //NVIC_InitStructure.NVIC_IRQChannel = 中断通道名; //开中断,中断名称见函数库 //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级 //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动此通道的中断 //NVIC_Init(&NVIC_InitStructure); 中断初始化

stm32库函数解释

部分库函数简介 一、通用输入/输出(GPIO)--------------------------------------------------------------------------------------------3 二、外部中断/事件控制器(EXTI)-----------------------------------------------------------------------------------7 三、通用定时器(TIM)-------------------------------------------------------------------------------------------------9四:ADC寄存器------------------------------------------------------------------------25 五:备份寄存器(BKP)-------------------------------------------------------------------------------------------------33 六、DMA控制器(DMA)---------------------------------------------------------------37 七、复位和时钟设置(RCC)------------------------------------------------------------------------------------------41 八、嵌套向量中断控制器(NVIC)-----------------------------------------------------------------------------------49

理解__STM32__GPIO初始化__库函数

使用库函数进行STM32的产品开发无疑可以节省大量时间。下面将介绍GPIO 初始化所用到的库函数 以最常用的GPIO设备的初始化函数为例,如下程序段一: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_InitStructure) 这是一个在STM32的程序开发中经常使用到的GPIO初始化程序段,其功能是将GPIOA.4口初始化为推挽输出状态,并最大翻转速率为50MHz。下面逐一分解:l 首先是1,该语句显然定义了一个GPIO_InitTypeDef类型的变量,名为 GPIO_InitStructure,则找出GPIO_InitTypeDef的原型位于 “stm32f10x_gpio.h”文件,原型如下: typedef struct { u16GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; 由此可知GPIO_InitTypeDef是一个结构体类型同义字,其功能是定义一个结构体,该结构体有三个成员分别是u16类型的GPIO_Pin、 GPIOSpeed_TypeDef类型的GPIO_Speed和GPIOMode_TypeDef类型的 GPIO_Mode。继续探查GPIOSpeed_TypeDef和GPIOMode_TypeDef类型,在“stm32f10x_gpio.h”文件中找到对GPIOSpeed_TypeDef的定义: typedef enum { GPIO_Speed_10MHz=1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; 则可知GPIOSpeed_TypeDef枚举类型同一只,其功能是定义一个枚举类型变量,该变量可表示GPIO_Speed_10MHz、GPIO_Speed_2MHz和 GPIO_Speed_50MHz三个含义(其中GPIO_Speed_10MHz已经定义为1,读者必须知道GPIO_Speed_2MHz则依次被编译器赋予2,而GPIO_Speed_50MHz 为3)。 同样也在“stm32f10x_gpio.h”文件中找到对GPIOMode_TypeDef的定义: typedef enum

stm32系统时钟配置问题

stm32系统时钟配置问题 系统从上电复位到72mz 配置好之前,提供时钟的是内如高速rc 振荡器提 供8MZ 的频率,这个由下面void SystemInit (void)函数的前面的一部分代码来 完成的和保证的:RCC->CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;#elseRCC- >CFGR &= (uint32_t)0xF0FF0000;#endif RCC->CR &= (uint32_t)0xFEF6FFFF; RCC->CR &= (uint32_t)0xFFFBFFFF; RCC->CFGR &= (uint32_t)0xFF80FFFF; #ifdef STM32F10X_CLRCC->CR &= (uint32_t)0xEBFFFFFF; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)RCC->CIR = 0x009F0000; RCC->CFGR2 = 0x00000000;#elseRCC->CIR = 0x009F0000;#endif#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif#endif 接着void SystemInit (void)调用SetSysClock();函数,将系统时钟配置到 72m,将AHB,APB1,APB2 等外设之前的时钟都配置好,然后切换到72mz 下 运行。所以在使用哪个外设的时候,只需要使能相应的外设时钟就可以了 tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

STM32固件库详解42324

STM32固件库详解 最近考试较多,教材编写暂停了一下,之前写了很多,只是每一章都感觉不是特别完整,最近把其中的部分内容贴出来一下,欢迎指正。本文内容基于我对固件库的理解,按照便于理解的顺序进行整理介绍,部分参考了固件库的说明,但是也基本上重新表述并按照我理解的顺序进行重新编写。我的目的很简单,很多人写教程只是告诉你怎么做,不会告诉你为什么这么做,我就尽量吧前因后果都说清楚,这是我的出发点,水平所限,难免有很大的局限性,具体不足欢迎指正。基于标准外设库的软件开发 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。

ST公司2007年10月发布了版本的固件库,MDK 之前的版本均支持该库。2008年6月发布了版的固件库,从2008年9月推出的MDK 版本至今均使用版本的固件库。以后的版本相对之前的版本改动较大,本书使用目前较新的版本。 使用标准外设库开发的优势 简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC 等等的所有标准外设。对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。 STM32F10XXX标准外设库结构与文件描述 1. 标准外设库的文件结构 在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的版本,开发环境中自带的标准外设库为版本,本书中以比较稳定而且较新的版本为基础介绍标准外设库的结构。

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器 1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,RC振荡器,频率为8MHz; (2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz; (3)LSI是低速内部时钟,RC振荡器,频率为40KHz; (4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体; (5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。倍频可选择为2 – 16倍,但 是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。 另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。 系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。系统时钟可以选择为PLL输出、HSI、HSE。系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用: (1)送给AHB总线、内核、内存和DMA使用的HCLK时钟; (2)通过8分频后送给Cortex的系统定时器时钟; (3)直接送给Cortex的空闲运行时钟FCLK; (4)送给APB1分频器。APB1分频器可以选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一

献给新手:解析STM32的库函数

意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是ST推出这样一个开发包的初衷。 但这对于许多从51/AVR这类单片机的开发转到STM32平台的开发人员来说,势必有一个不适应的过程。因为程序开发不再是从寄存器层次起始,而要首先去熟悉STM32所提供的固件库。那是否一定要使用固件库呢?当然不是。但STM32微控制器的寄存器规模可不是常见的8位单片机可以比拟,若自己细细琢磨各个寄存器的意义,必然会消耗相当的时间,并且对于程序后续的维护,升级来说也会增加资源的消耗。对于当前“时间就是金钱”的行业竞争环境,无疑使用库函数进行STM32的产品开发是更好的选择。本文将通过一个简单的例子对STM32的库函数做一个简单的剖析。 以最常用的GPIO设备的初始化函数为例,如下程序段一: GPIO_InitTypeDef GPIO_InitStructure; 1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 2 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 4 GPIO_Init(GPIOA , &GPIO_InitStructure 5 这是一个在STM32的程序开发中经常使用到的GPIO初始化程序段,其功能是将GPIOA.4口初始化为推挽输出状态,并最大翻转速率为50MHz。下面逐一分解: 首先是1,该语句显然定义了一个GPIO_InitTypeDef类型的变量,名为GPIO_InitStructure,则找出GPIO_InitTypeDef的原型位于“stm32f10x_gpio.h” 文件,原型如下: typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; 由此可知GPIO_InitTypeDef是一个结构体类型同义字,其功能是定义一个结构体,该结构体有三个成员分别是u16类型的GPIO_Pin、 GPIOSpeed_TypeDef 类型的GPIO_Speed和GPIOMode_TypeDef 类型的 GPIO_Mode。继续探查GPIOSpeed_TypeDef和GPIOMode_TypeDef类型,在“stm32f10x_gpio.h”文件中找到对GPIOSpeed_TypeDef的定义: typedef enum { GPIO_Speed_10MHz = 1,

STM32F4库函数笔记

(1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种 推挽输出:可以输出高,低电平,连接数字器件; 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行,一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。 浮空输入:由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 GPIO GPIO_Init函数初始化 { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF9,F10 } 2个读取输入电平函数: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。 例如: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。 例如: GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平 2个读取输出电平函数: uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。 例如:

stm32f030时钟配置工具AN4055

May 2012Doc ID 022837 Rev 11/17 AN4055 Application note Clock configuration tool for STM32F0xx microcontrollers Introduction This application note presents the clock system configuration tool for the STM32F0xx microcontroller family. The purpose of this tool is to help the user configure the microcontroller clocks, taking into consideration product parameters such as power supply and Flash access mode. The configuration tool is implemented in the “STM32F0xx_Clock_Configuration_VX.Y .Z.xls” file which is supplied with the STM32F0xx Standard Peripherals Library and can be downloaded from https://www.wendangku.net/doc/2614518319.html, . This tool supports the following functionalities for the STM32F0xx: ● Configuration of the system clock, HCLK source and output frequency ● Configuration of the Flash latency (number of wait states depending on the HCLK frequency)● Setting of the PCLK1, PCLK2, TIMCLK (timer clocks) and I2SCLK frequencies ●Generation of a ready-to-use system_stm32f0xx.c file with all the above settings (STM32F0xx CMSIS Cortex-M0 Device Peripheral Access Layer System Source File)The STM32F0xx_Clock_Configuration_VX.Y .Z.xls is referred to as “clock tool” throughout this document. Before using the clock tool, it is essential to read the STM32F0xx microcontroller reference manual (RM0091). This application note is not a substitute for the reference manual.This tool supports only the STM32F0xx devices. For VX.Y .Z, please refer to the tool version, example V1.0.0 https://www.wendangku.net/doc/2614518319.html,

STM32固件库详解

STM32固件库详解 https://www.wendangku.net/doc/2614518319.html,/emouse/archive/2011/11/29/2268441.html 1.1 基于标准外设库的软件开发 1.1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。 ST公司2007年10月发布了V1.0版本的固件库,MDK ARM3.22之前的版本均支持该库。2008年6月发布了V2.0版的固件库,从2008年9月推出的MDK ARM3.23版本至今均使用V2.0版本的固件库。V3.0以后的版本相对之前的版本改动较大,本书使用目前较新的V3.4版本。 1.1.2 使用标准外设库开发的优势 简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。对应的C源代

stm32启动文件详解

STM32启动文件详解 一、启动文件的作用 1.初始化堆栈指针SP; 2.初始化程序计数器指针PC; 3.设置堆、栈的大小; 4.设置异常向量表的入口地址; 5.配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM); 6.设置C库的分支入口__main(最终用来调用main函数); 7.在版的启动文件还调用了在文件中的SystemIni()函数配置系统时钟。

二、汇编指令

三、启动代码 ----- 栈 Stack_Size EQU 0x00000400 ; 栈的大小 AREA STACK, NOINIT, READWRITE,ALIGN=3 Stack_Mem SPACE Stack_Size ; 分配栈空间 __initial_sp ; 栈的结束地址(栈顶地址) 分配名为STACK,不初始化,可读可写,8(2^3)字节对齐的1KB空间。 栈:局部变量,函数形参等。栈的大小不能超过内部SRAM大小。 AREA:汇编一个新的代码段或者数据段。STACK段名,任意命名;NOINIT表示不初始化;READWRITE可读可写;ALIGN=3(2^3= 8字节对齐)。 __initial_sp紧挨了SPACE放置,表示栈的结束地址,栈是从高往低生长,结束地址就是栈顶地址。

----- 堆 Heap_Size EQU 0x00000200 ; 堆的大小(512Bytes) AREA HEAP, NOINIT, READWRITE,ALIGN=3 __heap_base ; 堆的起始地址 Heap_Mem SPACE Heap_Size ; 分配堆空间 __heap_limit ; 堆的结束地址 分配名为HEAP,不初始化,可读可写,8(2^3)字节对齐的512字节空间。__heap_base堆的起始地址,__heap_limit堆的结束地址。堆由低向高生长。动态分配内存用到堆。 PRESERVE8 -- 指定当前文件的堆/栈按照8 字节对齐。 THUMB-- 表示后面指令兼容THUMB 指令。THUBM 是ARM 以前的指令集,16bit;现在Cortex-M 系列的都使用THUMB-2 指令集,THUMB-2 是32 位的,兼容16 位和32 位的指令,是THUMB 的超级。 3.向量表 AREA RESET, DATA, READONLY EXPORT __Vectors E XPORT __Vectors_End E XPORT __Vectors_Size 定义一个名为RESET,可读的数据段。并声明__Vectors、__Vectors_End 和__Vectors_Size 这三个标号可被外部的文件使用。 __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler

stm32时钟详解

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。 另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。 系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用: ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。 ②、通过8分频后送给Cortex的系统定时器时钟。 ③、直接送给Cortex的空闲运行时钟FCLK。 ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。 ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。 在以上的时钟输出中,有很多是带使能控制的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。 需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

STM32库函数功能详解

STM32库函数简介 一、通用输入/输出(GPIO)--------------------------------------------------------------------------------------------3 二、外部中断/事件控制器(EXTI)-----------------------------------------------------------------------------------7 三、通用定时器(TIM)-------------------------------------------------------------------------------------------------9 四:ADC寄存器------------------------------------------------------------------------25 五:备份寄存器(BKP)-------------------------------------------------------------------------------------------------33 六、DMA控制器(DMA)---------------------------------------------------------------37 七、复位和时钟设置(RCC)------------------------------------------------------------------------------------------41 八、嵌套向量中断控制器(NVIC)-----------------------------------------------------------------------------------49

STM32固件库详解

STM32固件库详解基于标准外设库的软件开发 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。 ST公司2007年10月发布了版本的固件库,MDK 之前的版本均支持该库。2008年6月发布了版的固件库,从2008年9月推出的MDK 版本至今均使用版本的固件库。以后的版本相对之前的版本改动较大,本书使用目前较新的版本。 使用标准外设库开发的优势 简单的说,使用标准外设库进行开发最大的优势就在于可以使开发者不用深入了解底层硬件细节就可以灵活规范的使用每一个外设。标准外设库覆盖了从GPIO到定时器,再到CAN、I2C、SPI、UART和ADC等等的所有标准外设。对应的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。 STM32F10XXX标准外设库结构与文件描述 1. 标准外设库的文件结构 在上一小节中已经介绍了使用标准外设库的开发的优势,因此对标准外设库的熟悉程度直接影响到程序的编写,下面让我们来认识一下STM32F10XXX的标准外设库。STM32F10XXX的标准外设库经历众多的更新目前已经更新到最新的版本,开发环境中自带的标准外设库为版本,本书中以比较稳定而且较新的版本为基础介绍标准外设库的结构。

STM32固件库使用手册的中文翻译

UM0427用户手册 32位基于ARM微控制器STM32F101xx与STM32F103xx 固件函数库介绍 本手册介绍了32位基于ARM微控制器STM32F101xx与STM32F103xx的固件函数库。 该函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例。通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。 每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。 所有的驱动源代码都符合“Strict ANSI-C”标准(项目于范例文件符合扩充ANSI-C标准)。我们已经把驱动源代码文档化,他们同时兼容MISRA-C 2004标准(根据需要,我们可以提供兼容矩阵)。由于整个固态函数库按照“Strict ANSI-C”标准编写,它不受不同开发环境的影响。仅对话启动文件取决于开发环境。 该固态函数库通过校验所有库函数的输入值来实现实时错误检测。该动态校验提高了软件的鲁棒性。实时检测适合于用户应用程序的开发和调试。但这会增加了成本,可以在最终应用程序代码中移去,以优化代码大小和执行速度。想要了解更多细节,请参阅Section 2.5。 因为该固件库是通用的,并且包括了所有外设的功能,所以应用程序代码的大小和执行速度可能不是最优的。对大多数应用程序来说,用户可以直接使用之,对于那些在代码大小和执行速度方面有严格要求的应用程序,该固件库驱动程序可以作为如何设置外设的一份参考资料,根据实际需求对其进行调整。 此份固件库用户手册的整体架构如下: ?定义,文档约定和固态函数库规则。 ?固态函数库概述(包的内容,库的架构),安装指南,库使用实例。 ?固件库具体描述:设置架构和每个外设的函数。 STM32F101xx和STM32F103xx在整个文档中被写作STM32F101x。

STM32函数库的调用

STM32函数库的调用 一·时钟配置.c void RCC_Configuration(void) { /*将外设RCC寄存器重设为缺省值*/ RCC_DeInit(); /*设置外部高速晶振(HSE)*/ RCC_HSEConfig(RCC_HSE_ON); //RCC_HSE_ON——HSE晶振打开(ON) /*等待HSE起振*/ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振稳定且就绪 { /*设置AHB时钟(HCLK)*/ RCC_HCLKConfig(RCC_SYSCLK_Div1); //RCC_SYSCLK_Div1——AHB时钟= 系统时钟 /* 设置高速AHB时钟(PCLK2)*/ RCC_PCLK2Config(RCC_HCLK_Div1); //RCC_HCLK_Div1——APB2时钟= HCLK /*设置低速AHB时钟(PCLK1)*/ RCC_PCLK1Config(RCC_HCLK_Div2); //RCC_HCLK_Div2——APB1时钟= HCLK / 2 /*设置FLASH存储器延时时钟周期数*/ FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_2??2延时周期 /*选择FLASH预取指缓存的模式*/ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // 预取指缓存使能/*设置PLL时钟源及倍频系数*/ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLL的输入时钟= HSE时钟频率;RCC_PLLMul_9——PLL输入时钟x 9 /*使能PLL */ RCC_PLLCmd(ENABLE); /*检查指定的RCC标志位(PLL准备好标志)设置与否*/ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /*设置系统时钟(SYSCLK)*/ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK ——选择PLL作为系统时钟 /* PLL返回用作系统时钟的时钟源*/ while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作为系统时钟 {

相关文档