您的位置:首页 > 编程语言

14.知识点总结归纳—基于CT117E开发板的STM32库函数编程

2017-01-26 11:27 267 查看
一、LED
1.初始化

①定义:GPIO_InitTypeDef→GPIO_Initstructure
②开启APB2时钟:  (关键词 :APB2、Clock)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
③结构体配置:Pin直接设置为LED1,2,3等,Mode用Out_PP(推挽输出),Seepd用10M
④初始化:  GPIO_Init(GPIOC, &GPIO_InitStructure);
⑤初始为高电平: GPIO_SetBits(GPIOC,LEDALL);
2.使用
点亮:GPIO_ResetBits(GPIOC,LED1);
熄灭:GPIO_SetBits(GPIOC,LED1);
3.步骤
定义→开时钟→IO配置(OutPP)→初始化→高电平初始化→低亮高灭
二、Delay

延时函数的值到xxit.c的延时中断处理里自减
三、Key
1.初始化
①定义:GPIO_InitTypeDef→GPIO_Initstructure

②开启APB2时钟:  (关键词 :APB2、Clock) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

③结构体配置:引脚(多个引脚中间用|隔开)、模式:IPU上拉输入,两个即可。

④初始化:  GPIO_Init(GPIOC, &GPIO_InitStructure);

⑤定义按键:#define RB4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)→在GPIO.C最后一个StructInit下面
2.使用
设个函数,其用If检测并返回按键值,再用Switch判断该函数的返回值。
3.步骤
定义→开时钟→IO配置(IPU)→初始化→定义按键→写按键函数,用if返回→其它函数用Switch检测
四、LCD

要include studio.h
1.初始化
STM3210B_LCD_Init()+LCD_Clear(颜色)

2.使用
①显示字符串
②显示变量:sprintf(unit8_t 数组,"%s%d",“ADC:”,a)
五、ADC

1.初始化
①定义:GPIO_InitTypeDef→GPIO_Initstructure;ADC_InitTypeDef ADC_InitStructure;

②开时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);和IO的时钟
③IO口配置:引脚和模式(AIN)
④IO口初始化:GPIO_Init(GPIOC, &GPIO_InitStructure);
⑤ADC配置:

.Mode:独立模式 
.ADC_ScanConvMode = DISABLE 单通道
.ADC_ContinuousConvMode = DISABLE 单次转换
.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None 非外部触发启动
.ADC_DataAlign = ADC_DataAlign_Right 数据右对齐
.ADC_NbrOfChannel = 1 开启1个通道

⑥ADC初始化:ADC_Init(ADC1, &ADC_InitStructure);
⑦使能ADC并校准:在ADC.C中,找到ADC_Cmd,下面四个就是校准函数与状态函数,校一个等一个完成。

        ADC_Cmd(ADC1, ENABLE);   
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

⑧采样序列配置:在ADC.C的校准函数下面三四个函数左右
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5); 

2.使用
读取ADC值的函数,开启软件转换→延时→读取AD值,函数在ADC.C中都有。
值还要*3.3/0xfff
3.步骤
定义→开时钟→IO配置(AIN)→IO初始化→ADC配置(独立,两个DISABLE,一个NONE,右对其,1个通道)→ADC初始化→ADC使能并校准(在ADC.C中找到函数)→采样序列配置(.C中,通道8,1,13.5)→设读取函数→开软件转换→延时5MS→读取ADC值*3.3/0xfff
六、内部温度传感器

1.初始化
在ADC初始化基础上增加了一句ADC_TempSensorVrefintCmd(ENABLE)→ADC.C下部
;  修改了一句 ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5); 
2.使用
开启软件转换→延时→读取AD值→值*3.3/0xfff→(1430-值‘*1000)/4.3+25

3.步骤
与ADC基本相同
七、I2C

1.初始化
i2c_init(); →驱动中找

2.使用步骤
读数据函数:启动→写0XA0→等待完成→写目标地址→等待完成→写0XA1→等待完成→读接收值→等待完成→关闭
写数据函数:启动→写0XA0→等待完成→写目标地址→等待完成→
                  写变量                       →等待完成→关闭
八、USART

[b]1.初始化

①定义:GPIO_InitTypeDef→GPIO_Initstructure USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef
NVIC_InitStructure;

②开时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);和IO口时钟
③IO口配置
TX:引脚、模式:AF、速度:50 +IO口初始化GPIO_Init()
RX:引脚、模式:FLOATING、速度:50+IO口初始化GPIO_Init()
④串口配置
波特率:按要求
字长8b:USART_WordLength_8b(不记得8后面有什么就往下看,下面有定义)
停止位1:USART_StopBits_1
奇偶校验不要:USART_Parity_No

收发模式:USART_Mode_Rx | USART_Mode_Tx

硬件流不要,后面加_None即可
串口初始化UART_Init
⑤中断配置
中断分组1:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);→MISC.C中第一个函数!
通道设为串口2通道:USART2_IRQn→ stm32f10x.h中有定义
抢占优先级:1
子优先级:0
通道使能:ENABLE
中断初始化NVIC_Init
⑥开串口中断
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);→xxxuart.c中上部
⑦使能串口
USART_Cmd(USART2, ENABLE);→就在串口中断函数上面

2.使用
发信息:设发送函数,用.C中的USART_SendData发送,发一个等待一个发完,USART_GetFlagStatus(USART2,USART_FLAG_TXE)==reset,在.C中可找到,同时传入的参数为指针,用DO WHILE检测数组是否发完。
收信息:在it.c中的串口2中断函数中,若检测USART_GetITStatus()==set,清空标志位USART_ClearITPendingBit();(这俩函数都在.c的底部),随后接收串口数据,然后看接收了多少个数据满足要求,数组计数清空、接收标志为1、关闭中断。否则放入数组、计数。在主函数中检测接收标志位看是否有数据,每次用玩数据要对数组和标志位清空。
3.步骤
定义(IO、串口、NVIC)→开时钟→IO口配置(TX:AF、RX:FL)→GPIO_Init()→串口配置(8B、1、No、None、TXRX模式)→USART_init()→中断配置(分组(misc)、USART2_IRQn、1、0、使能)→NVIC_Init()→开串口中断→使能串口→设发信息函数(.C找发送函数和Flag,发一个等一个,do
while指针数组)→设收信息函数(在it.c中的中断函数中,检测中断状态,若set则清中断标志、接收值,若判得条件则置标志、清计数、关中断,否则不断放入数组。)


九、定时器

1.初始化

①定义:TIM_TimeBaseInitTypeDef 

②开时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

③定时器配置:

预分频系数:0
计数模式: TIM_CounterMode_Up向上计数→在头文件下的定义中找到
分频系数:x毫秒*1000

时钟分割TIM_ClockDivision:0

定时器初始化TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
④预分频配置:TIM_PrescalerConfig(TIM3,71, TIM_PSCReloadMode_Immediate);
→TIM.C里直接搜索Prescaler!
⑤中断配置:
中断分组1:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);→MISC.C中第一个函数!

通道设为定时器3通道: TIM3_IRQn→ stm32f10x.h中有定义

抢占优先级:0
子优先级:1
⑥开启中断:TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);→TIM.c上部

⑦定时器使能:TIM_Cmd(TIM3, ENABLE);→TIM.c上部

2.使用步骤

定义(TimBase)→开时钟(APB1)→定时器配置(预0、UP、分频Xms*1000、V0、TimeBaseInit)→预分频设置(找)→中断配置(分组、通道、0、1、)→开启中断(TIM.c上部)→使能定时器(TIM.c上部)
十、PWM

1.初始化

①定义:TIM_TimeBaseInitTypeDef  TIM_OCInitTypeDef  GPIO_InitTypeDef
  
②开时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
R_A.....(RCC_APB2Periph_GPIOA, ENABLE);→stm32f10x_rcc.c
③IO口配置:(定时器引脚位置在手册8.3.7找到)引脚、模式:AF、速度:50MHz、GPIO_Init

④定时器配置
⑤预分频设置(这两步与定时器里的设置一样)→TIM.C里直接搜索Prescaler!
⑥通道配置:
模式:TIM_OCMode_PWM2 
输出状态:TIM_OutputState_Enable;
互补输出状态:TIM_OutputNState_Enable;
脉冲值:x设置为传入的变量
通道初始化:TIM_OC2Init(TIM2, &TIM_OCInitStructure);(通道2则OC2)→TIM.c上部
⑦定时器使能:TIM_Cmd(TIM2, ENABLE);→TIM.c上部
⑧输出PWM使能:TIM_CtrlPWMOutputs(TIM2, ENABLE);→TIM.c上部!在TIM_Cmd下面
2.使用

利用初始化函数传入参数:TIM_Config(998/2,998*7/10);占空比用频率*
3.步骤

定义(TimeBase、OC、IO)→开时钟(定时器、IO口、.C.H找函数)→IO口配置(引脚、AF、50、GPIO_Init)→定时器配置(预0、UP、分频Xms*1000、V0、TimeBaseInit)→预分频设置(找)→PWM通道设置(PWM2、两使能、一变量、TIM_OC2Init)→定时器使能(找)→输出PWM使能(找)
十一、RTC

1.初始化

〇定义中断
①开时钟:电源时钟和备份区域时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,
ENABLE);
②取消备份区写保护: PWR_BackupAccessCmd(ENABLE);
③复位备份区域,开启外部低速振荡器

BKP_DeInit();
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

④选择RCT、使能

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();

⑤秒中断允许:RTC_ITConfig(RTC_IT_SEC, ENABLE);
RTC_WaitForLastTask();
⑥设预分频数:RTC_SetPrescaler(39999) ;RTC_WaitForLastTask(); 
⑦设置初始时间:RTC_SetCounter(HH*3600+MM*60+SS); RTC_WaitForLastTask();
⑧中断配置:通道:分组、RTC_IRQn、抢1、子0、init
⑨中断函数编写:RTC_IRQHandler(void);在其中我们检测RTC_GetITStatus(RTC_IT_SEC) ==SET(rcc.c最后2个),若产生秒中断则先清标志
RTC_ClearITPendingBit(RTC_IT_SEC);(rcc.c最后1个)
还要等待其完成RTC_WaitForLastTask();若达到24*60*60s;if (RTC_GetCounter() == 0x00015180);则清零RTC_SetCounter(0x0);RTC_WaitForLastTask();
2.使用

设时间显示函数,在函数中设三个变量分别代表时秒分,将RTC_GetCounter()得到的值/3600得时,对3600求%再/60得分,对3600求%再对60求%得到秒。再加上sprintf(text,"Time: %0.2d:%0.2d:%0.2d",THH, TMM, TSS);显示即可。
3.步骤

定义中断→开时钟(备份和电源)→取消保护→复位与震荡→选择与使能→开秒中断→设预分频数(39999)→设初时(HH*3600+MM*60+SS)→中断配置→中断函数编写(清零)→编写时间显示函数(总秒数计数处理,知道/3600,%3600/60,%3600%60的原理)
十二、输入捕获
1.初始化
①定义:TIM_TimeBaseInitTypeDef;TIM_ICInitTypeDef;NVIC_InitTypeDef ;GPIO_InitTypeDef

②开时钟:RCC_APB1Periph_TIM4;RCC_APB2Periph_GPIOB

③IO口配置:引脚、FLOATING、50、Init
④中断配置:通道、1、0、使能、Init
⑤定时器基础配置:

预分频系数:srr
计数模式: TIM_CounterMode_Up向上计数→在头文件下的定义中找到
分频系数:arr

时钟分割TIM_ClockDivision:0

定时器初始化TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

⑥定时器输入配置:
通道配置:TIM_Channel_2 
b4a5
//选择输入端 IC1 映射到 TI2 上
输入极性:ICPolarity_Rising
//上升沿捕获
输入选择:ICSelection_DirectTI//映射到 TI1 上
输入预分频:TIM_ICPSC_DIV1//配置输入分频,不分频

CFilter(滤波器设置):0x00
⑦PWM输入配置:TIM_PWMIConfig(TIM4, &TIM4_ICInitStructure); 
⑧选择有效输入端: TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);    
⑨配置为主从复位模式:TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);   TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);   
⑩开启中断: TIM_ITConfig(TIM4, TIM_IT_CC2|TIM_IT_Update, ENABLE); 
⑪清除中断标志位:TIM_ClearITPendingBit(TIM4, TIM_IT_CC2|TIM_IT_Update);
⑫定时器使能:TIM_Cmd(TIM4, ENABLE);   
2.使用

void TIM4_IRQHandler(void)

{


if(CollectFlag)

{

if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)//发生捕获事件

{	

duty = TIM_GetCapture1(TIM4); 	//占空比

period=TIM_GetCapture2(TIM4); //周期

}


  CollectFlag = 0;

}

TIM_ClearITPendingBit(TIM4, TIM_IT_CC2|TIM_IT_Update); 

}


TIM4_PWMINPUT_INIT(0xffff,0);//1分频,以72MHZ捕获


3.步骤
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 库函数 C语言