核心内容摘要
CANN与MindSpore:深度融合,为AIGC模型训练与推理注入澎湃动力
控制LED按键控制外部中断串口发送串口中断使用DMA搬运数据定时器内部定时器更新中断外部时钟定时器从模式定时器输入捕获PWM输出旋转编码器控制舵机ADCADC多通道采集LED屏幕通过手册写驱动库BOOT对于外设的驱动库将其拖入到文件中后.c,.h文件一般只需要关注配置的引脚然后在主函数直接调用函数即可。
控制LED在cubemx中选择led所在的引脚配置为推挽输出输出高低电平需要根据led的连接方式确定刚开始是灭还是亮。
在主函数中writepin函数进行点亮。
按键控制在cubemx中设置上拉输入这里具体需要看按键原理图然后直接在主函数判断如果是低电平也就是按下如何处理。
外部中断在cubemx中选择外部中断引脚可以选择上升沿下降沿触发配置好后在it文件里面找到callback函数在callback函数内部对接受进行处理。
串口发送简单的轮询在cubemx中开启串口后直接在主函数里面transmitreceive即可注意这里只能接受定长数据否则数据错乱。
串口中断在cubemx中打开中断在函数中开启receive_it这里是打开中断接受为了防止只能接受一次需要在回调函数再次开启在回调函数处理即可。
这里说的是接受中断发送中断直接写就可以不用再调用回调函数
使用DMA搬运数据在cubemx中打开DMA通道配置地址内容自增这里没搞明白每次搬运的字节数没有搞明白每次先默认字节然后生成代码后其代码方法与中断一致。
使用DMA还是有中断只不过是将cpu搬运数据这一过程交给dma处理了。
还是cplcallback函数回调这是dma的传输完成中断。
如果想要接受不定长数据需要借助别的中断也就是串口空闲中断这次只要接受数据寄存器上没有数据输入才会进入中断与前者区分。
exReceivetoidle这里开启串口空闲函数其对应的回调函数为uartex_rx_eventcallback回调函数。
开启了DMA的不定长数据接受后接受完输入的数据会进入回调函数此时通过hal_uart_transmit_dma()函数发送这里有一个入参可以确定不定长数据的长度。
发送即可。
DMA有个数据接受过半中断当数据量达到设置的最大值的一半以后也会触发uartex_rx_eventcallback关闭DMA传输过半中断函数__HAL_DMA_DIAABLE_IT,第二个参数为DMA_IT_HT。
总的说将IT函数改为DMA即可实现DMA数据收发将启动函数改为toidle回调函数为eventcallback可以实现不定长数据收发。
对于寄存器来说地址只有一字节的长度所以地址也就不需要变化内存需要挨个取数据所以内存变化
定时器这里使用定时器计使1s使用定时器的时候一定要开启定时器也就是HAL_TIM_Base_START()这里需要使用sprintf组合后发送才不会乱码。
__HAL_TIM_GET_COUNTER__HAL_TIM_SET_COUNTER__HAL_TIM_GET_AUTORELOAD__HAL_TIM_SET_AUTORELOAD__HAL_TIM_SET_PRESCALER所有设置的值都被存储在影子寄存器。
内部定时器更新中断开启中断使用periodelapsedcallback更新中断在回调函数里面写逻辑即可。
这里开启HAL_TIM_BASE_START_IT时候也自动开启了基本功能。
选择更新中断
外部时钟定时器对来自GPIO上信号进行计数。
TI1_ED只能双边沿触发TI_FP可以选择触发方式。
这里有单独的外部时钟模式2通道可以在从模式控制器被占用时候单独引入外部信号。
这里有个例子使用外部时钟本质和内部时钟一样也就是说内部时钟外部触发器TI1,TI2地位等价。
只不过需要外部信号作为时钟代码完全一样。
Filter的数值是使用内部时钟作为判断。
这里的外部时钟模式1。
TI1,TI2没太搞明白。
外部时钟模式1通过触发器接入选择外部时钟模式1后才可以选择TIP,TIED。
从模式定时器除了外部定时器1是与上面共用。
还有reset modegated mode trigger mode。
外部时钟模式1给定时器提供计数信号。
其他三种控制定时器的工作状态。
复位模式对定时器计数状态复位。
复位模式也就是在自动重装载的基础上再来一个中断可以一个定时器不干扰基本定时器的计数。
比如检测到一个上升沿打破计数输出中断。
并重新计数。
此时会进入定时器更新中断。
这也是另外三个模式的主要功能区别门电路当输入信号为高电平才开始计数否则不计数。
这里因为不进入中断所以在循环中判断当检测到高低电平此时清零标志位。
并发送从模式触发此时停止计数。
触发模式检测到边沿时进行计数。
只需检测到一个上升沿不需要像门电路一样一直处于高电平。
触发模式仅能启动定时器不能停止定时器。
触发模式配合单脉冲模式可以实现单脉冲定时器计数到自动重装载时停止计数。
也就是停止在0。
补充防止重启时进入更新中断一次。
输入捕获得知PA10为TIM1的通道3此时设置其通道3为直接模式通道4为间接模式。
此时有直接模式通道3间接模式通道4。
配置完毕后需要开启定时器以及输入捕获。
输入捕获为ic_start()显示捕获定时器1的通道3。
使用中断对应的中断回调函数为ic_capturecallback。
读取具体的捕获值的函数为总的来说选择一个有输入捕获功能的引脚。
一个使用直接捕获获得上升沿数据一个作为间接捕获获得下降沿数据。
PWM输出输入捕获/输出比较寄存器输出比较模式PWM模式1PWM模式2使用PWM生成模式输出PWM波设置的为pwm中高电平的时间改变high low设置高低电平时间。
开启PWM通道HAL_TIM_PWM_STATR(htim,CHANNEL)这里常用的函数有
旋转编码器(Encoder)将A,B相信号设置A为上升沿触发中断读此时B相的高低电平。
通过定时器来计时。
这里可以直接将旋钮接入外部时钟模式2来进行计数。
对于转速快的。
使用编码器接口编码器接口对上下边沿均敏感。
在上下边沿均会加1。
具体的连接方式为因为计数编码器的脉冲所以不用设置时钟源直接选择组合通道设置。
选择计数时刻POLARITY:设置有效电平为高电平还是低电平。
IC这里是直接捕获也就是TI1FP1,TI2FP2。
然后这里说一下按键按键这里按下接低电平松开没有外部上拉这里内部上拉保持按下时候为低电平不按下为高电平。
编码器模式:
控制舵机首先判断其pwm工作范围然后选择引脚的PWM生成模式这里cubemx设置是设置了使用内部时钟然后在此基础上选择占空比。
以此生成pwm波.注意这里使用pwm生成一定要开启pwm生成也就是__HAL_TIM_PWM_STATR()函数。
TB6612模块输入IN1,IN2PWM波控制输出OUT1,OUT2。
衰减指的是电流与后面刹车滑行对应。
按照表格写代码也就是一个低电平一个输入pwm波。
这个过程是选择一个引脚推挽输出低电平另一引脚通过pwm输出高电平。
控制速度。
ADC模拟数字转化逐次逼近法二分比较确定电压值。
实际操作过程。
启动ADC
采样转化
获取计算。
对于stm32f103有16个通道可以进行采样称其为16个外部通道。
两个内部通道一个是内部温度传感器一个是内部参考电压。
规则组像是一个排队的表格当将通道注册ADC会对此通道进行采样转化。
也可以一次注册多个通道让ADC进行采样转化。
实战测量电压值。
第一要点是ADC时钟不要太快不要超过14mhz。
否则会有警告。
这里使用的函数有等待转换完成的函数校准函数:注意校准函数要在while循环外示例这里是单次转化所以adc_start()在循环内部。
可以使用连续转化此时只需要在while循环外部开启一次转换即可。
此时代码变为
ADC多通道采集此时多通道需要开启扫描模式。
此时多配合DMA搬运数据使用。
此时DMA也可以设置为循环模式。
采样周期按照外设要求选择。
接着是DMA配置首先是外设到内存内存地址自增这里是因为相比之下接受外部数据此时单片机为内存。
内存地址自增防止数据覆盖。
这里因为ADC的分辨率是12位所以选择16位halfword。
这里要注意接受数组的位数要匹配halfword是uint16_t,word是uint32_t。
在代码中每一个是12位数所以用四个uint16类型即可表示。
最后参数是数组的长度注意区分。
这里需要注意如果不选择持续转换与DMA循环此时需要在循环里面开启ADC_DMA,然后在回调函数里面处理如果选择了持续转换与DMA循环此时随时可以取数据了在循环外开启。
并直接在while循环里面处理即可。
ADC:在设置采样频率时必须满足设置的采样频率大于待采样的2倍。
奈奎斯特定理。
DMA规则组可以同时转化16个通道但是只有一个数据寄存器。
只会保留最后的一个所以配合DMA使用注入组有四个通道不用担心数据被覆盖。
开始触发有规则组注入组。
双ADC模式。
DMA规则组可以同时转化16个通道但是只有一个数据寄存器。
只会保留最后的一个所以配合DMA使用注入组有四个通道不用担心数据被覆盖。
开始触发有规则组注入组。
双ADC模式。
单次转换非扫描模式转换完成eoc置一此时读取。
下次转换时候再开启连续转换非扫描模式不需要判断标志物想要读的时候直接读取。
单次转换扫描模式需要自己设置通道数全部转换完成eoc置一手动产生下一次开始新转化。
连续转换扫描模式左右对齐左移一次相当于数乘2如果不需要高分辨率此时取高八位。
一般选择右对齐就可以。
采样时间如果外部电源一直变化此时不准确所以使用一个电容采集电压进行判断。
闭合采样开关然后断开。
采样时间越大越能避免毛刺干扰。
转换时间采样时间12位adc转换周期。
校准执行一次校准。
LED屏幕Set_pixel():驱动库使用
使用方法使用一般其他的驱动库引用的方法一样。
其中汉字的字模
通过手册写驱动库
找到厂家给的引脚配置说明图。
通信协议芯片驱动使用现有驱动文件拖入.c,.h文件-在keil中加入.c文件如下操作引入.h文件路径。
将头文件加入公共头文件此时可以在其他主函数中引用公共头文件调用其中的函数。
输出模式的下拉是保持引脚在未被驱动的时候默认保持低电平。
新建自己的文件夹