stm32cubemx 常用参考

keil5软件仿真及调试:

1. keil5软件仿真及调试 https://blog.csdn.net/weixin_47447179/article/details/124495311

定时器:

1. STM32-定时器详解

https://blog.csdn.net/qq_44016222/article/details/123507270

2. STM32CubeMX配置定时器中断_小哥。的博客-CSDN博客

3. STM32CubeMX—PWM波输出实验

https://blog.csdn.net/qq_33728095/article/details/96159745

3.

FreeRtos:

1.STM32CubeMX FreeRTOS堆栈分配、调试技巧:STM32CubeMX FreeRTOS堆栈分配、调试技巧 - 腾讯云开发者社区-腾讯云 (tencent.com)

stm32cubemx中配置:

 

 或者:

 

 使用方法:

uint16_t task1_ram_availa =0;
for(;;)
{
........
    task1_ram_availa = uxTaskGetStackHighWaterMark(task1Handle);//获取最高任务栈剩余量
    printf("task1_ram_availa: %d\r\n",task1_ram_availa);
    osDelay(100);
}

 

2.  STM32CubeMX学习笔记(29)——FreeRTOS实时操作系统使用(消息队列)_Leung_ManWah的博客-CSDN博客_cubemx 消息队列

串口:

 1. STM32CUBEMX,UART_Transmit()及timeout参数的意义:

经验分享STM32CUBEMX,UART_Transmit()及timeout参数的意义 (stmicroelectronics.cn)

2. printf 重定向:

 stm32 hal printf重定向_无聊达612的博客-CSDN博客_hal 重定向

关于STM32中 printf函数的重定向问题 - 不会飞的小肥鱼 - 博客园 (cnblogs.com)

关于串口重定向,目前尝试只能使用HAL_UART_Transmit(),单个单个字节发送,使用包括中断传输HAL_UART_Transmit_IT(),DMA中断传输均会出现只发送 首字节的情况

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//注意把&huart1改为自己的stm32使用的串口号
    //HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);//不能使用
    //HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&ch,1);//不能使用
    return ch;
}

 

解决:由于使用中断发送数据,速度较直接发送慢,会出现前一句还没发送结束,后一句又覆盖发送的情况,这里使用串口标志位判断与超时判断确保数据发送完毕。目前看来,对于少部分数据,直接用HAL_UART_Transmit()对printf()进行重定向,效率较快;大组数据再采用中断或其他方式解决。

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    //HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//注意把&huart1改为自己的stm32使用的串口号
    
    //HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);
    HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&ch,1);    
    int cnt = 10000;//定义超时
    while((HAL_UART_STATE_READY !=huart1.gState)&&(cnt--));
    return ch;
}

 

3. 经测试,在使用FreeRTOS中,将串口响应任务设置为较高优先级,使用二值信号量进行控制,且任务阻塞时间osDelay()设置小点,可以提高串口任务的响应灵敏度。

 IIC配置:

(13条消息) IIC原理超详细讲解---值得一看_Z小旋的博客-CSDN博客_iic

(13条消息) 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )_Z小旋的博客-CSDN博客_hal_i2c_master_transmit

问题1:IIC传输一直处于HAL_BUSY状态

解决1:经测试,iic的SDA脚一直处低电平状态,导致主机一直判断从机忙,原因:使用了iic的隔离芯片,导致芯片的上拉到MCU的引脚被隔开,无法正常通讯

(1)对于iic的IO口只有开漏模式的,iic引脚选择引脚上拉 PULUP

(2)对于没有上下拉选项的,iic引脚选择推挽模式输出

总之,让SDA引脚能够正确判断从机空闲(拉高)、繁忙(拉低)状态即可。(解决方法参考:(13条消息) STM32 HAL 硬件IIC出现HAL_BUSY总结_涵墨轻笙的博客-CSDN博客

posted @ 2022-08-17 18:30  百叶集  阅读(104)  评论(0编辑  收藏  举报