零.商家资料包
1.armcc(编译器5安装)
①armcc里面只有四个文件
②在品文件里面添加armcc
2.dfp pack(Device Family Pack)芯片支持包
一 .整体思路
1.画逻辑思维导图
逻辑的主干可以由flag变量主导,其他硬件单独写函数,根据flag的变化而变化
实现功能有很多限定时,考虑所有变量
举例:
2.模板单拎一个文件,逻辑实现在上面修改
3.每次实现一个功能以后烧录验证
4.把if ,else if ,else 即所有变量写全面
思路细节-flag变量
1.谁可以作为flag变量: 作为触发条件的变量
2.如果触发条件之后只需要执行一次,则也可以运用flag变量
举个例子:
要实现: 行驶界面条件下,如果串口收到左转信号之后计时超过5s,没有按按键之后就串口返回一次warn
若screen_diriction是lcd上负责显示左右的flag变量,那控制“执行一次“的flag变量就可设为 screen_diriction_flag,初始值为0。当收到左或者右的串口指令时,flag为1。flag为1时串口发送warn,之后变回0(记得把它置回来)
3.常用的flag: screen ,screen_direction,button
二.模板整体构建
1.创建两个文件夹,其中一个用来用cubemx生成各种文件,一个文件夹作为考试上交的文件
2.cubemx3+3点注意:
debug设置为无,时钟源配置,时钟树配置
选择mdk,structure选base,选同时生成.c
3.main.c删除注释。加上全局变量,子函数声明区
(4.在src和inc里面建立bsp文件夹。在keil里面也新建bsp文件夹,并且在魔术棒里添加inc_bsp文件夹路径)
5.魔术棒里debug选择CMSIS dap debugger,setting里面选stop after reset。
6.中断优先级调整(uwtick改成最高,后面讲了)
7.include stdio和string
tip.每次在cubemx里面生成完之后,把初始化函数复制粘贴到考试文件相应位置,并且检查
代码细节:减速函数
减速参数通常在proc子函数里面,作用是ms级别延时,写法如下:
__IO uint32_t uwTick_Key_Set_Point = 0;
if((uwTick - uwTick_Key_Set_Point)<50) return;//减速函数
uwTick_Key_Set_Point = uwTick;
三.led灯与按键(都是低电平有效)
1.cubemx配置:
模式是output,input。电平是默认,高。
2.函数:
①led函数形参:uint8_t ucLED,
HAL_GPIO_WritePin(GPIOC, ucLED<<8, GPIO_PIN_RESET);
tip : 非阻塞led 间隔闪亮/按一段时间亮,按位操作
②按键
HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET
③长短按键
四.lcd
uint8-t str【20】
sprintf((char*)str,“number:%4d“,counter)
五.UART
1.串口发送函数
sprintf(),
HAL_UART_Transmit(&huart1, (unsigned char *)str, strlen((const char *)str), 50);
2.串口接收函数(用到中断)
①中断开启HAL_UART_Receive_IT(&huart1, &rx_buffer, 1); 其中1表示接收一个字节
②it.c里面有void USART1_IRQHandler(void) 不用额外配置,它的作用是: 检查中断来源(接收/发送/错误)。 清除对应的中断标志位。
③中断回调函数:
HAL_UART_RxCpltCallback(&huart1)
最后不要忘了在里面再次HAL_UART_Receive_IT(&huart1, &rx_buffer, 1);
tip:要是想在中断里面用delay 需要把tick定时器优先级调高(hal_init里面,172行hal_inittick的tick_int_piority)
六.ADC
1.cubemx参数配置:
①ADC_Settings里面: 外部时钟为异步,即由锁相环决定,两个adc直接没有联系(而同步为系统时钟决定);内部时钟为锁相环决定,二分频;
所以选择asy divided by 2。
其他为默认
②ADC_Regular里面
rank里面sampling time选择最高
③.时钟树里面选adc时钟连pll
2.扫描函数
七.TIM时钟
1.cubemx配置
①tim6是基本定时器,只要设置psc是8000-1(80M/8000 =10 000hz)和arr。打开nvic
②输入捕获的配置。tim2是通用定时器(选择pa15 即对应ch1 ,它与r40相连)。它的ch1和信号发生器模块连接,用来测量pwm波参数。mode是reset mode 即从模式。trigger source是TI1FP1,即通道1边沿检测。时钟选择内部时钟。对应通道如ch1选择input capture direct mode,ch2选input capture indirect mode (前者捕获上升沿,后者下降沿)。psc是80-1,arr选65535(按16位算)。捕获第一个选rising,第二个选falling。
tim2的NVIC的配置。把globalinterrupt打开。代码手动开启中断HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
(tip gpio_tim的配置都是复用模式)
③PWM的配置。tim3(PA6对应ch1)和tim17(PA7对应ch1)也是通用定时器。时钟选内部时钟。ch1选pwm generation。调节psc和arr。选pwm mode1 即向上计数时,<pulse是有效电平。pulse是ccr的值。关掉NVIC配置。
④方波的配置。tim15(PA4对应ch1)。时钟选内部时钟。ch1选output compare ch1。
2.
①基本定时器:
开启中断 HAL_TIM_BASE_START_IT(在driver_timer里面找.h Ctrl+Shift+F 。HAL_Tim_ PeriodElapsedCallback。判断是不是定时器六if(htim->Instance == TIM6)。(tip,在定时器中断里面自增 就是时间溢出一次自增一次)。
②输入捕获: 开启定时器二HAL_TIM_BASE_START(&htim2),开启它是为了让定时器计数,输出pwm则不用。 并且开启两个通道 HAL_TIM_IC_Start_IT(&htim2,TIM_CHANE_1)
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANE-)
③输出pwm波(不要中断
直接在初始化启动Hal_Tim_pwm_start(&htim3,TIM_CHANl_1)
④输出方波: 开启定时器十五 HAL_TIM_OC_START_IT。回调函数HAL_TIM_OC_DelayElapseCallback。
八.RTC
1.cube配置 : Active两个。时钟树 来自外部hse 32分频 750k。异步是125 同步是6000,所以得到1hz。
2.
此处rtc是二进制(十进制是bcd
九.e2prom
0.init
1.发送 单个字节
2.接受 单个字节
3.升级: 发送 接受字符串
十.手册查找
1.数据手册: 引脚图 p51/200
时钟树 p16/200