第一章
环境:STM32F429IGXX,HAL库,MD36N减速直流有刷电机,FreeRTOS操作系统
四线两相步进电机,EMWIN
一、电机的双路PWM控制正反转调速方式:
1.ENA接PWM输出,IN1与IN2接入高低电平。TIM_OCMODE_PWM2有效。
2.ENA接入高低电平,IN1与IN2接双路PWM输出或互补PWM输出
注:双路相同配置的PWM分别输出到IN1、IN2时,当IN1使能PWM输出时,IN2必须关闭PWM使能,因为IN1与IN2必须输出电平相反电机才会转动。
注:双路相反配置的PWM分别输出到IN1、IN2,必须同时使能,或同时stop。
通道1->TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
通道2->TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
调速方式:CCR寄存器 调速效果为[-MAX,0,+MAX]
TIM1_SetPWM_pulse(TIM_CHANNEL_3,dutyfactor);//
TIM1_SetPWM_pulse(TIM_CHANNEL_4,6000-dutyfactor);//6000为定时器period,自定义
TIM_TimeBaseStructure.Init.Period = 6000 - 1;
二、strtok函数返回值调用
char* data_sick[36][7]={0};
char *p0;
char *p1;
char *p2;
char *buf;
buf = (char*)TEMP_USART3_RX_BUF;
p0 = strtok(buf,"#");
p1 = strtok(NULL, "#");
p2 = strtok(NULL, "#");
data_sick[1][0]=p0;
data_sick[1][1]=p1;
data_sick[1][2]=p2;
char str0[10];
char str1[10];
char str2[10];
sprintf(str0,"%s",p0);
sprintf(str1,"%s",p1);
sprintf(str2,"%s",p2);
vTaskResume函数;//任务从挂起态->就绪态
三、串口发送一个字节数据
void sendByte(USART_TypeDef *USARTx, uint8_t byte)
{
USARTx->DR=byte;
while((USARTx->SR&0X40)==0); //循环发送,直到发送完毕
}
//USARTx->DR=byte;与while((USARTx->SR&0X40)==0);顺序颠倒后,有时发送的数据起始位置出现乱码。
void sendString(USART_TypeDef *USARTx, char *str)
{
while (*str)
{
sendByte(USARTx,*str++);
}
}
四、stm32HAL库串口的空闲中断与接收中断
未完待续...
五、stm32实现带usb触摸功能的VGA显示屏
未完待续...
六、usb工业摄像头的stm32实现
未完待续...
七、四线两相步进电机的stm32实现启停,角度精确控制
未完待续...
问题1:回调函数进不去
TIM_EncoderHandle.Init.Period = 1000;
//不可为0,开启的中断源与回调函数相对应更新中断使能需要在主函数循环中
问题2:AB相脉冲始终为0
检查GPIO的输入输出Mode
问题3:Error: L6218E: Undefined symbol HAL_SD_Get_CardInfo (referred from sdcard.o).
没有添加对应的stm32库文件,可找正确例子,不断找源文件名称(F12),逐步添加至工程。
问题4:电机的使能端的GPIO设置,开漏输出,PWM输出模式为TIM_OCMODE_PWM2.改变之后无法控制电机。
问题5:串口中断发送数据给消息队列
Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,784
Error:..\FreeRTOS\tasks.c,2808
问题6:hal库的程序一直卡在定时器中断服务函数出不来
问题7:串口中断与定时器中断与操作系统的优先级设定
问题8:定时器的TIM1_CH3N能否单独使用
问题9:delay函数卡死
user文件夹中的配置文件出错,每一个不同功能的配置文件不尽相同,当移植到新工程后,如果出现错误,不能随意地将原来文件覆盖新工程下的同名文件,应优先解决报错的问题。
问题10:四线两相步进电机电机只响不转
PWM波频率过低,亲测50000hz
TIM_TimeBaseStructure.Init.Period = 200;
// 通用控制定时器时钟源TIMxCLK = HCLK/2=90MHz //HCLK(180MHz)
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=10MHz
// 一个PWM周期时间=Period/10MHz = 0.00002s,输出频率为1/0.00002=50kHz
TIM_TimeBaseStructure.Init.Prescaler = 9-1;
问题11:emwin点击button,界面会闪动
答:与Touch函数里的延迟函数参数有关,适当调整即可,延迟过大,触摸响应缓慢,延迟过小,界面闪动
//触摸任务的任务函数
void touch_task(void *pvParameters)
{
while(1)
{
GUI_TOUCH_Exec();
vTaskDelay(13); //延时5ms
}
}
问题12:RTC在emwin界面过3、4秒才刷新一次
问题13:汉字在keil里的存储与显示
char* data_sick[36][6]; //main函数外声明
data_sick[1][0] ="干扰素"; //函数内赋值
问题14:Freertos+EMWIN删除子任务task,EMWIN界面停止不动
答:与EMWIN任务的TASK1_STK_SIZE有关,当TASK1_STK_SIZE过小时会出现这种情况
问题15:char*类型数据转整型数据
#include "stdlib.h"
int = atoi(char*);
问题16:FreeRTOS的任务与EMWIN,当EMWIN界面运行时,FreeRTOS任务执行,界面卡住
答:一个原因在于FreeRTOS任务中消息队列使用不恰当,导致EMWIN界面卡住。
原本任务与EMWIN界面配合可以无误。
问题17:MULTIEDIT如何实现文本替换
限制大小+
MULTIEDIT_SetMaxLen(MULTIEDIT_Drug,5); //大小貌似无影响
问题18:emwin的MULTIEDIT_AddText无法显示汉字
MULTIEDIT_AddText所需显示的汉字必须是带'\0'结束符的字符串,需要将char*类型数据进行格式转换,示例代码:
char *p0;
char str0[10];
sprintf(str0,"%s",p0);
问题19:FreeRTOS系统中定时器中断失效
答:在开启调度器时会初始化中断控制器,因此我们初始化中断控制器只能在任务调度之后进行,也就是在vTaskStartScheduler()开启任务调度之前,用户所用定时器中断,编码器中断等等均失效。而如果任务调度之前不进行中断初始化,那单片机的中断管理器无法接收到用户的配置信息。
处理办法:
int main(void)
{
TIMx_Configuration();/* 初始化基本定时器,用于处理定时任务 */
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
TIMx_Configuration();//此处需要再次调用中断初始化函数
taskENTER_CRITICAL();
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
根本原因所在
第二章
USB_HOST通信协议
以期用stm32驱动usb摄像头,带usb触摸功能的VGA显示屏,USB二维码扫描器
学习资料来自B站ST官方出品,STM USB培训视频
【ST官方出品】STM USB培训视频全集_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1yQ4y1k72c?p=2以下资料仅用于个人学习记录,如有建议,联系
USB IP作为全速USB设备
USB+IP作为全速USB设备
FS OTG IP 可用于全速与低速USB主机 ,可作为全速USB设备
HS OTG IP 可用于全速、高速、低速USB主机 ,可作为高速与全速USB设备
OTG IP library:(stm32_f105-07_f2_f4_usb-host-device_Lib.zip)
设备例程:AUDIO(音频),DFU(升级固件),HID(人机接口),MSC(大容量存储),VCP(串口)
Dual Core:FS IP与 HS IP同时工作,分别实现MSC与HID设备
主机例程:MSC(大容量存储),HID(人机接口)
Dual Core:FS IP与 HS IP同时工作,分别实现MSC与HID主机
USB+IP library:只能做设备(stsw-stm32092.zip)
- Audio_speaker(音频、扬声器)、CCID(智能卡)、Msc(U盘)
. custom_HID(用户定制HID例程)、HID、HID_LPM_test. (鼠标键盘模拟)
DFU. Virtual_COM_Port
.CDC+HID复合设备、MSC+HID复合设备
USB IP library:只能做设备(stsw-stm32081.zip)
- Audio_Speaker、DFU、Msc. Joystick、Custom_HID、 VCP.
MSC+HID复合设备
Packet:SOP(start of packet),SYNC(同步信号), Packet Content(数据包内容),EOP(end of packet)
Packet Content:PID,地址,帧号,数据,CRC
PID:数据包的ID号即类型
命令(Token) Packet
帧首(Start of Frame) Packet
数据(Data) Packet
握手(Handshake) Packet
第三章
环境 RT-Thread操作系统, STM32F103开发板
一、RT-Thread Studio配置普中TFT3.5寸彩屏(基于STM32F103ZET6)
链接:https://pan.baidu.com/s/1FkglQi7ppKMSUMOJhesllg?pwd=tlnn
第一步:建立RT-Thread工程,同时添加上述网盘中的LCD相关文件,如图(delay文件夹可无)
第二步:cubemax配置FSMC及BL引脚
普中PZ6806L单片机的BL引脚为PE0、PE1,output,pull-up
cubemax文件夹里SConscript增加c文件,同步scons配置至项目
第三步:RT-Thread配置
mian.c文件
#include
#include "tftlcd.h"
#include "delay.h"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include
#include "usart.h"
#include "gpio.h"
#include "fsmc.h"
int main(void)
{
int count = 1;
HAL_Init();
MX_GPIO_Init();
MX_FSMC_Init();
MX_USART1_UART_Init();
TFTLCD_Init();
delay_init(72);
LCD_ShowString(0, 0, 120, 20, 24, (uint8_t*)"hello");
while (count++)
{
rt_thread_mdelay(1000);
}
return RT_EOK;
}
右键工程名称,点击构建配置,加入lcd等文件路径
添加--工作空间--选择文件夹--确定--...--应用并关闭
二、ESP8266通过串口调试助手发送指令连接云平台(onenet,mqtt)注意命令后的回车
AT//测试模块是否能正常通讯,返回"ok"即为正常
AT+CWMODE=3//配置成 AT+STA模式
AT+RST//重启生效
输出结果中有固件烧录参数
SPI Speed : 40MHz
SPI Mode : DOUT
SPI Flash Size & Map: 32Mbit(1024KB+1024KB)
AT+CIFSR//查询设备IP
以下两条指令仅支持部分固件
AT+CWJAP=ssid,password
AT+IOTCFG=devid,proid,auth_info
devid 为设备DI,proid 为产品ID,auth_info为鉴权信息
三、RT-Thread studio ESP8266 onenet mqtt 完整步骤
1.ESP8266硬件配置
烧录软件(若esp8266如上图,里面参数不用变,只需更改bin文件位置)及固件打包网盘:
链接:https://pan.baidu.com/s/1kNDMtYTZlTsopiOrqU0ETA?pwd=alat
提取码:alat
2.模式配置
AT+CWMODE=3//配置成 AT+STA模式
AT+RST//重启生效
3.RT-Thread studio加入ESP8266与onenet的程序包(网上都有教程)
4.操作无误的话,ESP8266只会自动连接wifi,需要手动在串口调试助手里执行
onenet_mqtt_init指令,这样就可以连接到onenet云平台了。
5.需要传输数据,详情请看B站视频
http://【RT-Thread Studio】 https://www.bilibili.com/video/BV1dZ4y1b7WW?p=3&share_source=copy_web&vd_source=9208177a34ecb3f31472feb836f44ba6
问题1:RT-Thread添加已有程序时会出现uint8_t uint16_t uint32_t size_t未定义
https://pan.baidu.com/s/1FkglQi7ppKMSUMOJhesllg?pwd=tlnn
将连接里的sys.h文件包含即可。
问题2:fatal error: stdef.h: No such file or directory
网上有很多错误,正确的是:#include
问题3:Read response buffer failed. The Response buffer size is out of buffer size(128)!
修改响应最大支持的接收数据的长度为128,防止缓冲区内存过小
resp = at_create_resp(128, 0, rt_tick_from_millisecond(300));
at.Client.c位置:RT-ThreadStudio\workspace\test\rt-thread\components\net\at\src
另一种办法:
https://blog.csdn.net/zhjmyx/article/details/120869130https://blog.csdn.net/zhjmyx/article/details/120869130
问题4:could not stop cortex-m device
一种出现情况:如果单片机串口下载部分损坏,当仅用USB-TTL模块与STlink下载器时;
解决办法:未知原因,可以只用usb串口下载接口给单片机供电,另一个USB-TTL接口与ST-Llink换着用,切记,不可USB-TTL接口与单片机圆头供电口一起用(串口下载接口损坏,充电口异常情况下)电脑会黑屏