----------------------------------------------1/28/2018----------------------------------------------
新建工程模板——固件库流程:
1-先在本地新建一个文件夹,用于存储固件库文件;
(Doc、Libraries、Listings、Output、Project、User)
2-在工程里面添加组,然后在里面添加文件;
(STARUP、CMSIS、STM32F4xx_StdPeriph_Driver、User、Doc)
3-编译,会出现很多错误,打开stm32f4xx.h文件;
4-在工具链中的C/C++选项卡里面指定头文件的目录;
(把所有的.h文件目录都添加进来)
5-在工具链中的C/C++选项卡里面添加这两个宏:
USE_STDPERIPH_DRIVER,STM32F429_439xx,
6-把一下文件屏蔽掉,不编译它;
(stm32f4xx_cec.c,stm32f4xx_dsi.c,stm32f4xx_flash_ramfurc.c,stm32f4xx_fsmc.c,stm32f4xx_qspi.c)
7-修改stm32f4xx_it.c文件;
(删除:#include "main.h",TimingDelay_Decrement();)
8-配置仿真器
----------------------------------------------1/24/2018----------------------------------------------
GPIO输出初始化顺序:
1-打开GPIO端口的时钟
2-配置MODER寄存器
3-确定是推挽输出还是开漏输出(输出类型寄存器:OTYPER)
4-配置输出速度(输出速度寄存器:OSPEEDR)
5-内部上拉/下拉电阻要不要开启(上拉/下拉寄存器:PUPDR)
6-具体要输出的内容(置位复位寄存器:BSRR、数据输出寄存器:ODR)
GPIO输入初始化:
1-打开GPIO端口的时钟
2-选定具体的引脚号
3-配置为输入(MODER寄存器)
4-配置为下拉/上拉/浮空([PUPDR寄存器]具体情况而定)
推挽输出:
1.可以输出高低电平,高电平由VDD决定,低电平由VSS决定
2.两个三极管受两路互补信号控制,一个导通时另一个截止。开关效率高,电流大、驱动能力强。
3.输出高电平时,电流输出到负载,叫灌电流,可以理解为推;
输出低电平时,负载电流流向芯片,叫拉电流,即挽。
开漏输出:
1.只能输出低电平,不能输出高电平
2.如果要输出高电平,则需要外接上拉
3.具有“线与”功能,一个为低,全部为低(多用于I2C和SMBUS总线)
施密特触发器:
把信号更准确地分辨出为二进制的1或者0
(高于阈值电压都为1,;低于阈值电压都为0)
typedef指令:
相当于给一个已有的类型起了一个新的名字,然后可以像使用旧类型名一样使用新类型名来声明变量。
注意:并没有创建任何新类型,它只是为某个已存在的类型增加一个方便使用的标签。
红黄蓝三原色配色:
红 + 黄 = 橙
黄 + 蓝 = 绿
蓝 + 红 = 紫
----------------------------------------------3/18/2018----------------------------------------------
定时器分类:基本定时器、通用定时器、高级定时器
定时器资源:429有2个高级定时器(TIM1和TIM8)、10个通用定时器、2个基本定时器(TIM6和TIM7)
基本定时器(TIM6和TIM7)
1-计数器16bit,只能向上计数;
2-没有外部GPIO,式内部资源,只能定时;
3-时钟来自PCLK1,可实现1~65536分频;
影子寄存器
1-PSC和ARR都有影子寄存器;
2-起到缓冲的作用,用户值->寄存器->影子寄存器->起作用,
如果不使用影子寄存器则用户在写到寄存器之后则立刻起作用。
ARR影子,TIMx_CR1:APRE位控制。
定时时间的计算
1、PSC(分频因子)=9000-1,定时器频率=90M/(PSC+1)=10000HZ,计算一次脉冲的时间=1/10000 s
2、ARR(自动重载寄存器)=4999,从0计数到4999,则计了5000次
3、T=5000/10000=0.5S
Timer编程要点:
1-配置时间初始化结构体
2-开启定时器更新中断
3-配置中断优先级
4-使能定时器
5-编写中断服务函数
6-编写main函数
----------------------------------------------3/19/2018----------------------------------------------
中断编程的顺序:
1.使能中断请求;(跟具体的外设寄存器相关)
2.配置中断优先级分组;
(优先级设定:NVIC->IPRx;优先级分组:SCB->AIRCR:PRIGROUP[10:8])
3.配置NVIC寄存器,初始化NVIC_InitTypeDef;
4.编写中断服务函数,编写在stm32f4xx_it.c.(函数名在启动文件查找)
EXTI初始化结构体:(EXTI_InitTypeDef)
1.EXTI_Line:用于产生 中断/事件 线
2.EXTI_Mode:EXTI模式(中断/事件)
3.EXTI_Trigger:触发(上/下/上下 沿)
4.EXTI_LineCmd:使能或者失能(IMR/EMR)
EXTI编程要点(按键检测——中断方式)
1-初始化要连接到EXTI的GPIO
2-初始化EXTI用于产生中断/事件
3-初始化NVIC,用于处理中断
4-编写中断服务函数
5-main函数
----------------------------------------------3/21/2018----------------------------------------------
SysTick:系统定时器,24位,只能递减。
唯一的固件库函数:__STATIC_INLINE unit32_t SysTick_Config(uint32_t ticks);
编程要点:
1-初始化LED相关的GPIO
2-配置SysTick(STK_CTRL寄存器)
3-编写中断服务函数
4-main函数
----------------------------------------------3/28/2018----------------------------------------------
串口通信:
波特率 = fplck/8*(2-OVER8)*USARTDIV
波特率寄存器:USART_BRR
USARTDIV:无符号定点数
FPLCK:串口时钟,注区分APB2和APB1两条总线
OVER8:过采样模式(寄存器:USART_CR1)
UART编程要点:
1-初始化串口需要用到的GPIO,GPIO_InitTypeDef,
GPIO_PinAFConfig();
2-初始化串口,USART_InitTypeDef
3-中断配置
4-使能串口
5-编写发送和接受函数
6-编写中断服务函数
----------------------------------------------3/31/2018----------------------------------------------
DMA:Data Memory Access,直接存储器访问
DMA1:P->M,M->P
DMA2:P->M,M->P,M->M
编程要点:
M to M:
1-在Flash中定义好要传输的数据,在SRAM中定义好用来接收Flash数据的变量
2-确定使用DMA2,哪个数据流,哪个通道?
3-初始化DMA(DMA_DeInit()),主要是配置DMA初始化结构体(DMA_InitTypeDef)
4-使能DMA
5-编写数据比较函数
6-编写main函数
M to P:
1-初始化串口
2-配置DMA初始化结构体
3-编写main函数(开启串口发送DMA请求)
----------------------------------------------3/31/2018----------------------------------------------
I2C编程要点:
1-配置通讯使用的目标引脚为开漏模式;
2-使能I2C外设的时钟;
3-配置I2C外设的模式、地址、速率等参数并使能I2C外设;
4-编写基本I2C按字节收发函数;
5-编写读写EEPROM存储内容的函数;
6-编写测试程序,对读写数据进行校验。
eg.我们的 PCLK1=45MHz,想要配置 400Kbit/s 的速率,计算方式如下:
PCLK时钟周期: TPCLK1 = 1/45000000
目标SCL时钟周期: TSCL = 1/400000
SCL时钟周期内的高电平时间: THIGH = TSCL/3
(CCR寄存器的DUTY为0:
SCL时钟周期内的低电平时间: TLOW = 2*TSCL/3)
计算CCR的值: CCR = THIGH/TPCLK1 = 37.5
----------------------------------------------/4/8/2018----------------------------------------------
SPI编程要点:
1-初始化通讯使用的目标引脚及端口时钟;
2-使能SPI外设的时钟;
3-配置SPI外设的模式、地址、速率等参数并使能SPI外设;
4-编写基本SPI按字节收发的函数;
5-编写对FLASH擦除及读写操作的函数;
6-编写main函数。