《2022年STM32学习笔记 .pdf》由会员分享,可在线阅读,更多相关《2022年STM32学习笔记 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一、 GPIO 基本功能的使用:GPIO 功能文件相关操作:1.使用 GPIO 功能前,首先要初始化系统,最简单的方法为:添加stm32f10 x_rcc.c ,打开stm32f10 x_conf.h 在第 41 行将 /* #include stm32f10 x_rcc.h*/两边注释符去掉,在 main函数中添加代码SystemInit(); 2.添加 stm32f10 x_gpio.c 3.打开 stm32f10 x_conf.h 在 37 行将 /*#include stm32f10 x_gpio.h*/两边注释符去掉GPIO 口使能:1.定义一个初始化类型结构体变量,我们为这个结构体
2、里的各个变量赋值,GPIO_InitTypeDef GPIO_InitStructure; 2. 开启 GPIO 时钟,只有开启了GPIO 时钟,对应端口才可以正常工作,GPIO 口对应时钟APB2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 3. 为结构体赋值设置 GPIO 口为输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /设置引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /通用推挽输出,其它选项GPIO_InitStructur
3、e.GPIO_Speed = GPIO_Speed_50MHz; /输出最大频率,其它选项设置 GPIO 口为输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /设置引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/悬空输附:GPIO_Mode值GPIO_Mode_AIN 模拟输入GPIO_Mode_IN_FLOATING 浮空输入GPIO_Mode_IPD 下拉输入GPIO_Mode_IPU 上拉输入GPIO_Mode_Out_OD 开漏输出GPIO_Mode_Out_PP 推挽输出GPIO_
4、Mode_AF_OD 复用开漏输出GPIO_Mode_AF_PP 复用推挽输出GPIO_Speed值GPIO_Speed_10MHz 最高输出速率10MHz GPIO_Speed_2MHz 最高输出速率2MHz GPIO_Speed_50MHz 最高输出速率50MHz 4. 使能 GPIO 口GPIO_Init(GPIOA, &GPIO_InitStructure); 例:精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 1 页,共 10 页 - - - - - - - - - - void GPIOA0_
5、Init(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure
6、.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO 使用:输出状态:GPIO 口置高: GPIO_SetBits(GPIOA,GPIO_Pin_0| GPIO_Pin_1); GPIO 口置底: GPIO_ResetBits(GPIOA,GPIO_Pin_0); 写数据到 GPIO 的某个引脚: GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET); 写数据到 GPIO:G
7、PIO_Write(GPIOA, 0 x1101); 得到 GPIO 口状态: GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);u16 ReadValue; ReadValue = GPIO_ReadOutputData(GPIOC); 例:#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_0) #define LED0_ON GPIO_SetBits(GPIOA,GPIO_Pin_0) #define LED0 GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0) int main(
8、void) while(1) delay(); if(LED1) LED0_OFF; else LED0_ON; 输入状态:得到 GPIO 口状态: GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 2 页,共 10 页 - - - - - - - - - - u16 ReadValue; ReadValue = GPIO_ReadInputData(GPIOC); 二、 USART 串口基本功能实现添加 stm32f10 x_
9、rcc.c stm32f10 x_gpio.c stm32f10 x_usart.c 打开 stm32f10 x_conf.h 在 37 行将/*#include stm32f10 x_gpio.h*/41行 /* #include stm32f10 x_rcc.h*/ 46行 /*#include stm32f10 x_usart.h*/ 两边注释符去掉USART 串口配置1.Gpio 引脚配置,将USART 的 TX 口配置为输出,RX 配置为浮空输入2.配置时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 3.配置 usar
10、t USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; /波特率 115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /8位数据USART_InitStructure.USART_StopBits = USART_StopBits_1; /停止位 1 位USART_InitStructure.USART_Parity = USART_Parity_No ; /无校验位USART_InitStruct
11、ure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); 4.配置中断,可以跳过USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 5.打开串口USART_Cmd(USART1, ENABLE); 例:void COM_Init(void) GPIO_InitTypeDef G
12、PIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 , ENABLE); /* 配置USART1 Tx (PA9) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 -
13、 - - - - - - - - -第 3 页,共 10 页 - - - - - - - - - - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /输出最大频率为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); /* 配置USART1 Rx (PA10) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; /浮空输入模式GPIO_Init(GPIOA,
14、&GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; /波特率115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; /8位数据USART_InitStructure.USART_StopBits = USART_StopBits_1; /停止位1位USART_InitStructure.USART_Parity = USART_Parity_No ; /无USART_InitStructure.USART_HardwareFlowCon
15、trol = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); USART 串口使用1.发送字符USART_SendData(USART1, 1); / 往串口 1 发送字符1 while (USART_GetFlagStat
16、us(USART1, USART_FLAG_TXE) = RESET);/ 等待发送结束2.接收字符unsigned char a; if(USART_GetFlagStatus(USART1, USART_IT_RXNE)=RESET)/有数据来 while(USART_GetFlagStatus(USART1, USART_IT_RXNE)=RESET) ;/等待接收完成a=USART_ReceiveData(USART1);/ 接收数据 例:unsigned char ch; if(USART_GetFlagStatus(USART1, USART_IT_RXNE)=RESET)/有数据
17、来(在中断中,可去掉) while(USART_GetFlagStatus(USART1, USART_IT_RXNE)=RESET);/等待接精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 4 页,共 10 页 - - - - - - - - - - 收完成; ch=USART_ReceiveData(USART1);/接收数据delay(10); /不加延时 会产生堵塞USART_SendData(USART1, ch); /往串口1发送字符1 while (USART_GetFlagStatus(U
18、SART1, USART_FLAG_TXE) = RESET); 3C 标准输出函数Printf 的使用:包含头文件 #include /包含标准c 库的输入输出头文件添加函数int fputc(int ch, FILE *f) USART_SendData(USART1, (unsigned char) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) = RESET) ; return ch; 然后就可以在程序中调用printf ()了4.串口中断处理函数在项目中添加misc.c 文件,找到stm32f10 x_conf.h 文
19、件的第48 行/*#include misc.h*/去掉两边的注释符配置中断优先级例:NVIC_InitTypeDef NVIC_InitStructure; /定义数据结构体NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0 x0);/将中断矢量放到Flash的0地址NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/设置优先级配置的模式,详情请阅读原材料中的文章/使能串口中断,并设置优先级NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStruc
20、ture.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /将结构体丢到配置函数,即写入到对应寄存器中打开串口中断(USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);串口接受中断)找到 stm32f10 x_it.c中 USART 的中断子函数如void USART
21、1_IRQHandler(void) ;也可以将此函数移动到其它文件下。在函数中添加相应代码。例:void USART1_IRQHandler(void) unsigned char a,b,c; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)/中断来 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 5 页,共 10 页 - - - - - - - - - - while(USART_GetFlagStatus(USART1, USART_IT_
22、RXNE)=RESET); /等待接收完成a=USART_ReceiveData(USART1); if(a=a) while(USART_GetFlagStatus(USART1, USART_IT_RXNE)=RESET);/等待接收完成b=USART_ReceiveData(USART1);/接收数据if(b=0) GPIO_SetBits(GPIOA,GPIO_Pin_0); else GPIO_ResetBits(GPIOA,GPIO_Pin_0); while(USART_GetFlagStatus(USART1, USART_IT_RXNE)=RESET);/等待接收完成c=US
23、ART_ReceiveData(USART1);/接收数据if(c=1) GPIO_SetBits(GPIOA,GPIO_Pin_1); else GPIO_ResetBits(GPIOA,GPIO_Pin_1); 三、通用定时器TIMx功能实现添加 stm32f10 x_tim.c 打开 stm32f10 x_conf.h 文件,将45 行/*#include stm32f10 x_tim.h*/两边注释符去掉基本定时功能实现1.配置 RCC,使能 TIMx RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 2.配置 NVIC ,设置优
24、先级等NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 3.配置 TIMx TIM_TimeBaseI
25、nitTypeDef TIM_TimeBaseStructure; /设置计数器溢出周期(周期系数-1)TIM_TimeBaseStructure.TIM_Period = 35999; /设置分频系数(分频系数-1)TIM_TimeBaseStructure.TIM_Prescaler = 1999; /设置计数方向TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /使能定时器中断TIM_ITConfig(TIM2, TIM_I
26、T_Update, ENABLE); 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 6 页,共 10 页 - - - - - - - - - - /使能定时器TIM_Cmd(TIM2, ENABLE); 4.写中断钩子函数(或称为中断服务函数,在文件 stm32f10 x_it.c 中,也可在其它文件中创建) void TIM2_IRQHandler(void) if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) TIM_ClearITPendingBi
27、t(TIM2, TIM_IT_Update); /input your code 例:用 TIM定时器功能输出周期为20ms 占峰比 50%pwm 信号设置定时器2 的定时周期为10um 定义全局变量num 预定义#define GPIO0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_0) #define GPIO0_ON GPIO_SetBits(GPIOA,GPIO_Pin_0) void TIM2_IRQHandler(void) if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) TIM_ClearITPendi
28、ngBit(TIM2, TIM_IT_Update); num=(num+1)%2000; if(numPSC 2定时器在使能后会启动,如果这个时候其它初始化还没完成,容易造成不可知的错误,所以在初始化的时候,是能定时器应该尽量放在最后四、 EXTI 使用方法1.添加 stm32f10 x_exti.c , 打开 stm32f10 x_conf.h 在第 34 行将 /* #include stm32f10 x_exti.h */两边注释符去掉2. 配置相关 GPIO 口为输入模式3.设置外部中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_
29、PinSource3); 4.配置外部中断EXTI_InitTypeDef EXTI_InitStructure; /* Configure Key Button EXTI Line to generate an interrupt on falling edge */ EXTI_InitStructure.EXTI_Line = EXTI_Line3; /外部中断0 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /
30、下降沿产生中断EXTI_InitStructure.EXTI_LineCmd = ENABLE; /使能中断线0 上中断EXTI_Init(&EXTI_InitStructure); 5.配置中断优先级6.在外部中断服务程序中添加相关语句精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 10 页 - - - - - - - - - - 文档编码:KDHSIBDSUFVBSUDHSIDHSIBF-SDSD587FCDCVDCJUH 欢迎下载 精美文档欢迎下载 精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 10 页,共 10 页 - - - - - - - - - -