蓝桥杯嵌入式模块附录(旧板)
附1:固件库函数
//初始化例程
STM32固件库代码V3.5版\stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ 下各模块文件查看
//函数所在文件
GPIO---stm32f10x.gpio.h
TIM---stm32f10x.tim.h
RTC---stm32f10x_rtc.h
LED部分:
GPIO\IOToggle\main.c
初始化部分: 58~64
行
RCC_APB2PeriphClockCmd //启用或禁用高速APB(APB2)外设的时钟
GPIO_Init //GPIO初始化,需要用到下面结构体
GPIO_SetBits //设置指定的数据端口位(即高电平)
GPIO_ResetBits //清除指定的数据端口位(即低电平)
//结构体(stm32f10x_gpio.h)
GPIO_InitTypeDef GPIO_InitStructure;
//成员
GPIO_Pin(管脚):GPIO_Pin_x(可以是16位的十六进制数/宏定义)
GPIO_Mode(模式8种):GPIO_Mode_Out_PP推挽输出,GPIO_Mode_Out_OD开漏输出,GPIO_Mode_AF_OD复用开漏输出,GPIO_Mode_AF_PP复用推挽输出,GPIO_Mode_IPU上拉输入,GPIO_Mode_IPD下拉输入,GPIO_Mode_IN_FLOATING浮空输入,GPIO_Mode_AIN模拟输入
GPIO_Speed(最高输出速率3种):GPIO_Speed_10/2/50MHz
蜂鸣器部分:
GPIO_PinRemapConfig //改变指定管脚的映射
按键部分(TIM4):
TimeBase\main.c
TIM部分: 88~93
行, 133
, 136
行
TIM中断部分: 182~190
行
TIM_TimeBaseInit //定时器初始化,需要用到下面结构体
NVIC_Init //中断初始化,需要用到下面结构体
TIM_ITConfig //使能或者失能指定的TIM中断
TIM_Cmd //使能或者失能TIMx外设
void TIM4_IRQHandler(void) //TIM4中断服务函数,名字固定了可在启动文件100行左右找(startup_stm32f10x_md.s)
GPIO_ReadInputDataBit //读取指定端口管脚的输入(返回值是u8类型,1或0!)
TIM_GetITStatus //检查指定的TIM中断是否发生(返回SET表示发生,返回RESET表示未发生)
TIM_ClearITPendingBit //清除中断处理位
//通用定时器部分结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
//成员
TIM_ClockDivision(时钟分频因子):默认0即可(即不分频),这个起到滤波,一点点延时的作用,这个值不会影响PWM频率
TIM_CounterMode(计数模式):默认0即可(即向上计数)
TIM_Period(自动重装载值/溢出值): 根据公式计算-- (arr+1)X(psc+1)/72MHz,一般选择 arr-1
TIM_Prescaler(预分频系数):定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定 TIMx_PSC寄存器的值。可设置范围为 0 ~ 65535,实现 1 ~ 65536 分频 (分频系数越小越精准) 一般选择 psc-1
TIM_RepetitionCounter(高级定时器才有):这个参数,必须配置,不能默认,不然pwm更新中断的次数不确定,不想用配置为0即可
//中断部分结构体
NVIC_InitTypeDef NVIC_InitStructure;
//成员
NVIC_IRQChannel(选择指定的中断通道):
NVIC_IRQChannelCmd(定义的IRQ通道被使能还是失能):参数是ENABLE/DISABLE
NVIC_IRQChannelPreemptionPriority(抢占优先级):值越小优先级越大
NVIC_IRQChannelSubPriority(响应优先级):值越小优先级越大
USART部分
USART\Interrupt\main.c
USART部分: 103~126
行, 173
行(改一下管脚即可)
USART中断部分: 229~232
行(没有响应优先级的,需要自己加)
USART中断服务函数:同目录下的 stm32f10x_it.c
198~210
行(中断接收)
USART_Init //USART初始化
USART_ITConfig //使能或者失能指定的USART中断
USART_Cmd //使能USARTx
USART_GetITStatus //检查指定的USART中断是否发生(返回SET表示发生,返回RESET表示未发生)
USART_ClearITPendingBit //清除中断处理位
USART_ReceiveData //返回USARTx最近接收到的数据
//USART结构体
USART_InitTypeDef USART_InitStructure;
//成员
USART_BaudRate(波特率):一般是9600
USART_WordLength(数据位):8个一般
USART_StopBits(停止位):1个一般
USART_Parity(奇偶校验):一般无
USART_HardwareFlowControl(硬件流控制模式):一般是禁止
USART_Mode(模式):收发---USART_Mode_Rx | USART_Mode_Tx;
RTC部分
RTC\LSI_Calib\main.c
中断部分:160~164
行
RTC部分: 181~216
行(最后两行不用,加另外两行即可)
中断服务函数:同目录下的 stm32f10x_it.c
151~161
行(需要修改一下)
RTC_SetCounter(Time); //写入时间
RTC_WaitForLastTask(); //等待对RTC寄存器操作完成
PWR_BackupAccessCmd //使能或者失能RTC和后备寄存器访问
BKP_DeInit //复位BKP
RCC_LSICmd //使能或者失能内部低速晶振(LSI)
RCC_GetFlagStatus //检查指定的RCC标志位是否设置(返回SET表示已设,返回RESET表示未设)
RCC_RTCCLKConfig //设置RTC时钟(RTCCLK)
RCC_RTCCLKCmd //使能或者失能RTC时钟
RTC_WaitForSynchro //等待最近一次对RTC寄存器的写操作完成(跟下面有区别,区别是这个必须是在APB复位后的任何读操作之前必须调用这个函数) 与时钟同步
RTC_WaitForLastTask //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig //使能或者失能指定的RTC中断
RTC_SetPrescaler //设置RTC预分频的值
RTC_SetCounter //设置RTC计数器的值
RTC_GetITStatus //检查指定的RTC中断是否发生(返回SET表示发生,返回RESET表示未发生)
ADC部分
ADC\ADC1_DMA\main.c
GPIO部分(管脚初始化): 140
,143
行(改一下管脚跟IO组)
ADC部分: 40
行,89~95`行(改一下通道号,周期)
DMA部分: 41
行,
RCC_AHBPeriphClockCmd //使能或者失能AHB外设时钟,一般是使能DMA,其他不怎么用
ADC_Init //ADC初始化
ADC_RegularChannelConfig //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
ADC_DMACmd //开启ADC的DMA支持
ADC_Cmd //开启ADC
ADC_ResetCalibration //重置指定的ADC的校准寄存器
ADC_GetResetCalibrationStatus //获取ADC重置校准寄存器的状态
ADC_StartCalibration //开始指定ADC的校准状态
ADC_SoftwareStartConvCmd //获取指定ADC的校准程序
//ADC部分结构体
ADC_InitTypeDef ADC_InitStructure;
//成员
ADC_Mode(独立/双ADC模式): 一般是独立模式
ADC_ScanConvMode(单通道/双通道):
ADC_ContinuousConvMode(连续/单次模式):
ADC_ExternalTrigConv(外部/软件触发):一般是软件控制转换
ADC_DataAlign(左对齐/右对齐):一般右对齐
ADC_NbrOfChannel(通道数目)
//DMA部分结构体
DMA_InitTypeDef DMA_InitStructure;
//成员
DMA_PeripheralBaseAddr(外设基地址):一般需要(u32)&
DMA_MemoryBaseAddr(DMA数据存储地址):用户自定义的,需要(u32)&变量名
DMA_DIR(外设作为数据来源还是目的地):一般选为数据来源
DMA_BufferSize(数据大小)
DMA_PeripheralInc(外设基地址是否地址)
DMA_MemoryInc(数据存储地址是否递增)
DMA_PeripheralDataSize(外设数据大小):有8,16,32位选择
DMA_MemoryDataSize(数据存储大小):同上
DMA_Mode(循环/非循环模式)
DMA_Priority(通道优先级)
DMA_M2M(是否内存-->内存)
PWM模式部分
TIM\PWM_Output\main.c
37~38
行,90~95
行, 98~105
行,131
行,134
行
TIM_OC2PreloadConfig //使能或者失能TIMx在CCR2的预装载寄存器(数字对应通道号)
TIM_OC3PreloadConfig //使能或者失能TIMx在CCR3的预装载寄存器(数字对应通道号)
TIM_ARRPreloadConfig //使能或者失能TIMx在ARR上的预装载寄存器
TIM_SetCompare2 //设置TIMx捕获比较2寄存器值(数字对应通道号)
TIM_SetCompare3 //设置TIMx捕获比较3寄存器值(数字对应通道号)
//结构体
TIM_OCInitTypeDef TIM_OCInitStructure;
//结构体成员(共8个,但是PWM模式只用到以下)
TIM_OCPolarity(极性):高电平/低电平
TIM_Pulse(CRR值):也就是比较值,可以设置0然后在main函数那用库设置CRR那些,也可以写 计数值X占空比
TIM_OutputState(输出使能): xxx_Enable即可
TIM_OCMode(6种模式):这里只需要PWM模式---PWM1,PWM2模式
PWM输出比较部分
TIM\PWM_OCToggle\main.c
37~40
行(全局变量需要定义4个),89~92
行,97~111
行,130
, 133
行,196~203
行(改一下中断优先级即可,初始化需要加3条清0操作如果双通道,单通道2条)(需要添加4条计算)
中断服务函数:同目录下的 stm32f10x_it.c
150~183
行(只留下通道1和2的即可然后添加每个通道添加一个 if…else…)
TIM_SetCounter //设置TIMx计数器寄存器值
TIM_ITConfig //使能或者失能指定的TIM中断
TIM_ClearITPendingBit //清除TIMx的中断待处理位
TIM_GetCapture1 //获得TIMx输入捕获1的值(数字对应通道号)
//注意点:
//用到了4个结构体
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//初始化需要清0步骤!
PWM捕获频率部分(一路适用于CH1/CH2)
TIM\PWM_Input\main.c
TIM_IC部分:76~97
行
NVIC部分:140~147
行(修改中断优先级即可)
还有个TIM_TimeBaseStructure跟上面一样,arr设置65535,psc设置71即可
中断服务函数:同目录下的 stm32f10x_it.c
148~169
行(频率计算公式改一下,占空比公式删了)
频率公式:Frequence = 1000000 / (float)(Fre_VAL + 1);
初始化不是 TIM_Init
,而是 TIM_PWMIConfig
TIM_PWMIConfig //PWM输入配置
TIM_SelectInputTrigger //选择TIMx输入触发源
TIM_SelectSlaveMode //选择TIMx从模式
TIM_SelectMasterSlaveMode //设置或者重置TIMx主/从模式
TIM_GetCapture2 //获得TIMx输入捕获2的值
TIM_GetCapture1 //获得TIMx输入捕获1的值
//结构体
TIM_ICInitTypeDef TIM_ICInitStructure;
//成员
TIM_Channel(通道):可以是1/2/3/4
TIM_ICPolarity(输入活动沿):参数可以是上升沿/下降沿
TIM_ICSelection(选择输入):有直连,非直连,TRC连接
TIM_ICPrescaler(设置输入捕获预分频器):一般不分频即0
TIM_ICFilter(选择输入比较滤波器):参数0x0~0xF,一般0x0
PWM捕获频率/占空比(适用全部通道)
TIM\InputCapture\main.c
75~87
行
113~120
行
130~137
行
还有个TIM_TimeBaseStructure跟上面一样,arr设置65535,psc设置71即可
中断服务函数:自己写
TIM_OC1PolarityConfig //设置TIMx通道1极性(数字对应通道号)
PWM互补输出
TIM\ComplementarySignals\main.c
GPIO部分:196~199
行
TIMBase部分:106~110
行
TIM_OC部分:115~127
//结构体
TIM_OCInitTypeDef TIM_OCInitStructure;
//结构体成员(共8个)
TIM_OCMode(PWM模式):PWM1/PWM2
TIM_OutputState(主通道输出使能)
TIM_OutputNState(互补通道使能)
TIM_Pulse(CRR值):可以设0,在主函数设置占空比
TIM_OCPolarity(主通道极性):hight/low
TIM_OCNPolarity(互补通道极性):hight/low
TIM_OCIdleState(空闲状态):SET--高电平/RESET--低电平
TIM_OCNIdleState(互补通道空闲状态):SET--高电平/RESET--低电平
滴答定时器延时
# define AHB_INPUT 72 //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)
void delay_us(u32 us)//uS微秒级延时程序
{
SysTick->LOAD=AHB_INPUT*us;//重装计数初值(当主频是72MHz,72次为1微秒)
SysTick->VAL=0x00;//清空定时器的计数器
SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
while(!(SysTick->CTRL&0x00010000));//等待计数到0
SysTick->CTRL=0x00000004;//关闭定时器
}
void delay_ms(u32 ms)//mS毫秒级延时程序
{
while(ms--!=0)
{
delay_us(1000);
}
}
附2:函数参数类型与返回值解释
//参数类型
FunctionalState NewState(功能状态 新状态):ENABLE/DISABLE(使能/不使能)
u32 RCC_APB2Periph(指定APB2外设的时钟门):参数可以AD,I/O(GPIO),USART1,高级定时器TIM1/TIM8
u32 RCC_APB1Periph(指定APB1外设的时钟门):参数可以通用定时器TIM2/3/4,USART2/3,I2C1/2
GPIO_TypeDef* GPIOx(选择GPIO组):参数GPIOA~G
GPIO_InitTypeDef* GPIO_InitStruct(GPIO结构体指针):参数是结构体,要用&
u16 GPIO_Pin(管脚):参数是管脚(可以是16位的十六进制数)
u32 GPIO_Remap:选择重映射的管脚
TIM_TypeDef* TIMx(选择TIMx外设):参数2/3/4
TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct(TIM结构体指针):参数是结构体,要用&
uint16_t TIM_IT(TIM中断源):参数如果是一般定时功能的话都是---TIM_IT_Update(TIM中断源) ,如果用到PWM捕获/比较,则选CC1~CC4(数字对应通道号)
USART_TypeDef* USARTx(选择USARTx外设):参数1/2/3/4/5
uint16_t USART_IT(USART中断源):参数一般只用到接收/发送源,即---USART_IT_TXE(发送中断)/USART_IT_RXNE(接收中断)
USART_InitTypeDef* USART_InitStruct(USART结构体指针):参数是结构体,要用&
uint32_t RCC_RTCCLKSource(设置RTC时钟):参数有LEI,LSE,HSE/128
uint16_t RTC_IT(RTC中断源):参数有秒中断,闹钟中断,溢出中断
u32 CounterValue(计数值):
u32 PrescalerValue(预分频值):LSI一般选40000或者40000-1
uint8_t RCC_FLAG(待检查的RCC标志位):
ADC_TypeDef* ADCx(选择ADCx外设):
ADC_InitTypeDef* ADC_InitStruct(ADC结构体指针):
uint8_t ADC_Channel(被设置的ADC通道)
uint8_t Rank(采用顺序):1~6
uint8_t ADC_SampleTime(通道的ADC采样时间) :没有要求则一般是239.5周期
//返回值类型
ITStatus(中断状态):SET:1 RESET:0
FlagStatus(设置状态):SET:1 RESET:0
u16 TIM_InputTriggerSource(输入触发源):有8种,目前常用TI1FP1/TI2FP2
u16 TIM_SlaveMode(TIM从模式):有4种,在本项目使用TIM_SlaveMode_Reset
u16 TIM_MasterSlaveMode(定时器主从模式):Enable/Disable两种状态
u16 Counter(计数器存储器新值):0~0xFFFF
uint16_t TIM_OCPolarity(极性):hight/low(高/低电平) Falling/Rising(下降沿/上升沿)