-
STM32
学习笔记
GPIO
口
GPIO
初始化
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//
声明结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//
打开功能时钟
(
再写这句程序的时候,
必须进行时钟系统初始化的操作
)
。
GPIO__Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//
指明操作对象
引脚
GPIO__Speed = GPIO_Speed_50MHz;//
设置
I O
口时钟为
50MHz/10MHz/2MHz
GPIO__Mode = GPIO_Mode_Out_PP;//
设置推挽输出
/*GPIO_Mode_AIN
模拟输入
GPIO_Mode_IN_FLOATING
浮空输入
(一般为中断所使用)。
GPIO_Mode_IPD
下拉输入
GPIO_Mode_IPU
上拉输入
GPIO_Mode_Out_OD
开漏输出
GPIO_Mode_Out_PP
推挽输出
GPIO_Mode_AF_OD
复用开漏输出
GPIO_Mode_AF_PP
复用推挽输出
*/
(
一般用在点灯
)。
GPIO_Init(GPIOA, &GPIO_InitStructure); //
执行初始化
IO
口
}
GPIO
常用函数
GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//
置高
IO
口
GPIO_ResetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//
置低
IO
口
GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4)));//
翻转
IO
口
GPIOA->ODR = 0X0010 //IO
口直接赋值语句
G PIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)(
读取该口的电压 值,相当于
AVR
的
pin
)
。若
平,则这个函数返回为< br>1
,为低电平时返回为
0.
IO
口为高电
SysTick
系统时钟
SysTick
配置函数
if (SysTick_Config(SystemCoreClock / 3000))//
配置时钟的频率
,
改变数字可改变频率,数字越大频率越快
{
/* Capture error */
while (1);
}
EXTI
中断
外部中断
外部中断
IO
口设置
void GPIO_EXTI_Configuration(void)
{
RCC_APB2 PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph _GPIOD, ENABLE);//
使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//
使能复用
IO
时钟
GPIO_InitTypeDef GPIO_InitStructure;//
声明
IO
口初始化结构体
GPIO__Pin = GPIO_Pin_6;//
指定
PD.06
为操作对象
GPIO__Mode = GPIO_Mode_IN_FLOATING;//
设置模式为浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//
初始化
IO
口
GPIO__Pin = GPIO_Pin_13|GPIO_Pin_14; //
指定
PD.13,14
为操作对象
GPIO__Mode = GPIO_Mode_IN_FLOATING; //
设置模式为浮空输入
GPIO_Init(GPIOD, &GPIO_InitStructure);//
初始化
IO
口
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); //
将
PC.06
映射到外部中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13); //
将
PD.13
映射到外部中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource14); //
将
PD.14
映射到外部中断
}
外部中断初始化
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;//
声明外部中断初始化结构体
EXTI__Line = EXTI_Line6|EXTI_Line13|EXTI_Line14;//
使能外部中断线路
6,13,14
EXTI__Mode = EX TI_Mode_Interrupt;//
设置
EXTI
线路模式为中断
EXTI__Trigger = EXTI_Trigger_Rising;//
设置触发方式为上升沿
EXTI__LineCmd = ENABLE;//
使能中断线路
EXTI_Init(&EXTI_InitStructure);//
初始化结构体
}
外部中断向量
&
优先级设定
void NVIC_EXTI_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;//
声明中断向量
&
优先级设定结构体
NVIC_PriorityGroupConf ig(NVIC_PriorityGroup_2);//
选择中断向量组别为
2
组
NVIC__IRQChannel = EXTI9_5_IRQn;//
指定外部中断向量
NVIC__IRQChannelPreemptionPriority = 0;//
设置该中断的先占优先级
NVIC__IRQChannelSubPriority = 0;//
设置该中断的从优先级
NVIC__IRQChannelCmd = ENABLE;//
使能该外部中断
NVIC_Init(&NVIC_InitStructure);//
初始化外部中断
NVIC__IRQChannel = EXTI15_10_IRQn;//
指定外部中断向量
NVIC__IRQChannelPreemptionPriority = 0;//
设置该中断的先占优先级
NVIC__IRQChannelSubPriority = 0; //
设置该中断的从优先级
NVIC__IRQChannelCmd = ENABLE;//
使能该外部中断
NVIC_Init(&NVIC_InitStructure); //
初始化外部中断
}
由抢先优先级和从优先级实现了中断嵌套,进而使程序即使处理更加要紧的事情。且高的抢 先优先级可以
打断低的抢先优先级,当抢先优先级相同时,那就比较从优先级,先响应高的。当二者都相 同时,先响应
物理地址低的中断。
外部中断函数
/*example1*/
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line6) != RESET)
//
如果对应的中断线路触发事件,注意可以一个中断向量对应多个中断引脚
{
/*add code */
EXTI_ClearITPendingBit(EXTI_Line6);//
清中断标志
}
}
/*example2*/
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
//< br>如果对应的中断线路
13
触发事件,注意可以一个中断向量对应多个中断引脚
{
/* add code */
EXTI_ClearI TPendingBit(EXTI_Line13);//
清中断标志位
}
if(EXTI_GetITStatus(EXTI_Line14) != RESET) //
如果对应的中断线路
14
触发事件,注意可以一个中断向量对应多个中断引脚
{
/* add code */
EXTI_ClearITPendingBit(EXTI_Line14); //
清中断标志位
}
}
中断
channel
表
WWDG_IRQChannel
窗口看门狗中断
0x00
PVD_IRQChannel
TAMPER_IRQChannel
RTC_IRQChannel
FlashItf_IRQChannel
RCC_IRQChannel
EXTI0_IRQChannel
EXTI1_IRQChannel
EXTI2_IRQChannel
EXTI3_IRQChannel
PVD
通过
EXTI
探测中断
篡改中断
RTC
全局中断
FLASH
全局中断
全局中断
外部中断线
0
中断
外部中断线
1
中断
外部中断线
2
中断
外部中断线
3
中断
RCC
EXTI4_IRQChannel
外部中断线
4
中断
DMAChannel1_IRQChannel
DMA
通道
1
中断
DMAChannel2_IRQChannel
DMAChannel3_IRQChannel
DMAChannel4_IRQChannel
DMAChannel5_IRQChannel
DMAChannel6_IRQChannel
DMAChannel7_IRQChannel
ADC_IRQChannel ADC
USB_HP_CANTX_IRQChannel
USB_LP_CAN_RX0_IRQChannel
DMA
通道
2
中断
DMA
通道
3
中断
DMA
通道
4
中断
DMA
通道
5
中断
DMA
通道
6
中断
DMA
通道
7
中断
全局中断
USB
高优先级或者
CAN
发送中断
USB
低优先级或者
CAN
接收
0
中断
CAN_RX1_IRQChannel
CAN_SCE_IRQChannel
EXTI9_5_IRQChannel
TIM1_BRK_IRQChannel
TIM1_UP_IRQChannel
TIM1_TRG_COM_IRQChannel
TIM1_CC_IRQChannel
TIM2_IRQChannel
TIM3_IRQChannel
TIM4_IRQChannel
I2C1_EV_IRQChannel
CAN
接收
1
中断
CAN SCE
中断
外部中断线
9-5
中断
TIM1
暂停中断
TIM1
刷新中断
TIM1
触发和通讯中断
TIM1
捕获比较中断
TIM2
全局中断
TIM3
全局中断
TIM4
全局中断
I2C1
事件中断
5
至
9
对应一个中断源)。
(
I2C1_ER_IRQChannel
I2C2_EV_IRQChannel
I2C2_ER_IRQChannel
SPI1_IRQChannel
SPI2_IRQChannel
USART1_IRQChannel
USART2_IRQChannel
USART3_IRQChannel
EXTI15_10_IRQChannel
RTCAlarm_IRQChannel
USBWakeUp_IRQChannel
I2C1
错误中断
I2C2
事件中断
I2C2
错误中断
SPI1
全局中断
SPI2
全局中断
USART1
全局中断
USART2
全局中断
USART3
全局中断
外部中断线
15-10
中断
RTC
闹钟通过
EXTI
线中断
USB
通过
EXTI
线从悬挂唤醒中断
EXIT
中断分为三种:一种为0
至
4
,一种为
5
至
9
,一种为
10
至
15.
中断优先级表
NVIC_PriorityGroup
NVIC_PriorityGroup_0
NVIC_PriorityGroup_1
NVIC_PriorityGroup_2
NVIC_PriorityGroup_3
NVIC_PriorityGroup_4
NVIC_IRQChanne
的先占优先级
0
0-1
0-3
0-7
0-15
NVIC_IRQChann
的从优先级
0-15
0-7
0-3
0-1
0
描述
先占优先级
0
位
从优先级
4
位
先占优先级
1
位
从优先级
3
位
先占优先级
2
位
从优先级
2
位
先占优先级
3
位
从优先级
1
位
先占优先级
4
位
从优先级
0
位
TIM
定时器
TIM1
TIM1 PWM
波模式
TIM1
基本配置初始化
void TIM1_BASE_Configuration(void)
{
TIM_DeInit(TIM1);//
将定时器
1
寄存器设置为缺省值
/*TIM1
基本设置
*/
TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure;//
声明初始化结构体
TIM1__Prescaler = 0x0; //
设置周期
TIM1__Period = 0xFFFF; //
设置分频,范围
0-0XFFFF
TIM1__ClockDivision = 0x0; //
设置时钟分割
TIM1__CounterMode = TIM_CounterMode_Up;//
计数模式,向上计数
TIM1__RepetitionCounter = 0x0;//
计数器重载值
TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructur e);//
初始化结构体
}
TIM2
TIM2
普通模式
TIM2
基本配置初始化
void TIM2_BASE_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//
声明初始化结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//
使能定时器
2
,注意时钟源是
APB1
TIM__Period = 7200; //
设置周期时间,范围
0-0XFFFF
TIM__Prescaler = 9999;//
设置分频,范围
0-0XFFFF
TIM__ClockDivision = 0;//
时钟分割
TIM__CounterMode = TIM_CounterMode_Up;//
向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//
初始化定时器基本配置
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//
清除刷新中断标志位
TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);//
开启计数中断
TIM_Cmd(TIM2, ENABLE);//
使能
TIM2
}
TIM2
中断初始化
void NVIC_TIM2_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;//
声明结构体
NVIC_Prior ityGroupConfig(NVIC_PriorityGroup_0);//
设置优先级组< br>0,1,2,3,4
NVIC__IRQChannel = TIM2_IRQn;//
中断向量:定时器
2
全局中断
NVIC__IRQChannelPreemptionPriority = 0;//
设置先占优先级
NVIC__IRQChannelSubPriority = 1;//
设置从优先级
NVIC__IRQChannelCmd = ENABLE;//
中断使能
NVIC_Init(&NVIC_InitStructure);//
初始化中断
}
TIM2
中断函数
void TIM2_IRQHandler(void)//
定时器
2
中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//
等待刷新完成
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//
清刷新数据中断标志位
/*add code */
}
}
TIM3
TIM3 PWM
波模式
TIM3 PWM
基本初始化设置
void TIM3_BASE_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //
声明基本初始化结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //T3
时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //T3
时钟使能
TIM__Period = 7200; //
周期
72M/7200=10KHz.
TIM__Prescaler = 0; //
分频
TIM__ClockDivision = 0; //
时钟分割
TIM__CounterMode = TIM_CounterMode_Up; //
计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //
执行初始化
TIM3
TIM_Cmd(TIM3, ENABLE); //
使能计数
}
TIM3 PWM
通道初始化
void TIM3_CHANNEL_Configuration(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure; //
声明初始化结构体
/***************************
通道
1 ********************************/
TIM__OCMode = TIM_OCMode_PWM2; //
模式选择:
PWM2
TIM__OutputState = TIM_OutputState_Enable; //PWM
波输出使能
TIM__Pulse = CCR1_Val; //
写比较值占空比
TIM__OCPolarity = TIM_OCPolarity_Low; //
比较时清零
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //
使能预装载寄存器
/******************************
通道
2 ******************************/
/* PWM1 Mode configuration: Channel2 */
TIM__OutputState = TIM_OutputState_Enable; //PWM
波输出使能
TIM__Pulse = CCR2_Val; //
写比较值占空比
TIM__OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //
使能预装载寄存器
/*******************************
通道
3 *********************************/
/* PWM1 Mode configuration: Channel3 */
TIM__OutputState = TIM_OutputState_Enable; //PWM
波输出使能
TIM__Pulse = CCR3_Val; //
写比较值占空比
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //
使能预装载寄存器
/******************************
通道
4 *********************************/
/* PWM1 Mode configuration: Channel4 */
TIM__OutputState = TIM_OutputState_Enable; //PWM
波输出使能
TIM__Pulse = CCR4_Val; //
写比较值占空比
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //
使能预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); //
重新装载计数使能
}
TIM3 PWM IO
口设置
void GPIO_ TIM3_ Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//
使能时钟
GPIO_InitTypeDef GPIO_InitStructure; //
声明初始化结构体
GPIO__Pin = GPIO_Pin_6 | GPIO_Pin_7; //
指定
IO
口
GPIO__Mode = GPIO_Mode_AF_PP; //
模式为复用推挽输出
GPIO__Speed = GPIO_Speed_50MHz; //
最大速度
50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //
执行
GPIO
初始化
GPIO__Pin = GPIO_Pin_0 | GPIO_Pin_1; //
指定
IO
口
GPIO_Init(GPIOB, &GPIO_InitStructure); //
执行
GPIO
初始化
}
TIM3 PWM
波占空比装载函数
TIM_SetCompare4(TIM3,CCR4_Val);
T=NxP/72MHz
其中
N
为周期数,
P
为分频数。
N=
TIM_Period-
CCRx_Val
。
T
即 为所配出的
PWM
的周期。
UART
串口
UART
功能设置
void UART_ Configuration(void)
{
USART_InitTypeDef USART_InitStructure;//
声明串口结构体
USART__BaudRate = 115200;//
波特率为
115200
USART__WordLength = USART_WordLength_8b;//
数据长度
8
位
USART__StopBits = USART_StopBits_1;//1
位停止位
USART__Parity = USART_Parity_No;//
无奇偶校验
USART__HardwareFlowControl = USART_HardwareFlowCon trol_None;//
不使能硬件
流控制
USART__Mode = USART_Mode_Rx | USART_Mode_Tx;//
使能发送,接收
USART_Init(USART1, &USART_InitStructure);//
初始化串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//
串口接收中断使能
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //
串口发送中断使能
USART_Cmd(USART1, ENABLE);//
串口使能
}
UART IO
口设置
void UART_ GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//
声明
GPIO
结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|
RCC_APB2Periph_AFIO,
ENABLE);//
使能串口
1
,
复用
IO
时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//
使能
GPIOA
时钟
GPIO__Pin = GPIO_Pin_9;
GPIO__Speed = GPIO_Speed_50MHz;
GPIO__Mode = GPIO_Mode_AF_ PP;//GPIOA9
为串口发送引脚,设置为复用推挽输出
模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO__Pin = GPIO_Pin_10;
GPIO__Speed = GPIO_Speed_50MHz;
GPIO__Mode = GPIO_Mode_IN_FLOATING; //GPIOA10
为串口接收引脚,设置为浮
空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
UART
中断初始化
void NVIC_UART_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;//
声明串口初始化结构体
NVIC _PriorityGroupConfig(NVIC_PriorityGroup_1);//
设 置优先级组
NVIC__IRQChannel = USART1_IRQn;//
指定中断类型
NVIC__IRQChannelPreemptionPriority = 0;//
设置先占优先级
NVIC__IRQChannelSubPriority = 0;//
设置从优先级
NVIC__IRQChannelCmd = ENABLE;//
使能中断
NVIC_Init(&NVIC_InitStructure);//
执行初始化函数
}
-
-
-
-
-
-
-
-
本文更新与1970-01-01 08:00,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/553637.html
-
上一篇:没有了
下一篇:没有了