发新帖我要提问
12
返回列表
打印
[应用相关]

STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS

[复制链接]
楼主: xiaoqizi
手机看帖
扫描二维码
随时随地手机跟帖
21
xiaoqizi|  楼主 | 2021-7-5 14:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
细节4:
什么是回调函数?
回调函数就是一个通过函数指针调用的函数:编写一个函数,另一个函数可以用这个函数当参数。

原子有另外的解释:STM32 不完全手册( ( H AL 库 版) Msp 回调函数执行过程解读

在 STM32 的 HAL 驱动中HAL_PPP_MspInit()作为回调,被 HAL_PPP_Init()函数所调用。当我们需要移植程序到 STM32F1平台的时候,我们只需要修改 HAL_PPP_MspInit 函数内容而不需要修改 HAL_PPP_Init 入口参数内容。
下面这个函数或许更应该称为Callback函数。但毋庸置疑的是,HAL实现都用句柄操作,大量用__weak修饰一些回调函数,用户需要自己编写逻辑实现而不用过多在意硬件底层。

void HAL_UART_RxCpltCallback( UART_HandleTypeDef *huart )
{
        if ( huart->Instance == USART1 )                        /* 如果是串口1 */
        {
        }
}


使用特权

评论回复
22
xiaoqizi|  楼主 | 2021-7-5 14:10 | 只看该作者
细节5:
在目录ALIENTEK MiniSTM32 V3.0开发板资料\6,软件资料\3,EMWIN学习资料\stm32cubef1\STM32Cube_FW_F1_V1.0.0中打开Release_Notes。包里面资料一应俱全,我建议我自己反复翻阅一下,能够更快熟悉HAL库。





使用特权

评论回复
23
xiaoqizi|  楼主 | 2021-7-5 14:13 | 只看该作者
3 freeRTOS
用cubeMX肯定图谋freeRTOS,尽情玩起来。
有下面注意点:
1 单片机是单核的,freeRTOS是为了让其CPU充分利用,任务切换。
2 任务切换依靠freeRTOS里的任务就绪状态表执行,对就绪任务进行分优先级切换。
3 freeRTOS是可抢断的。
4 临界区代码是指关闭所有中断后执行的一段代码,执行完后记得打开全局中断,不然任务无法切换。
5 任务的状态与切换。

6 任务之间的通信依靠信号量、消息队列、消息邮箱等机制。
7 内存管理的一些事情。
8 内核裁剪的一些事情。
9 cubeMX把freeRTOS的方法再次封装了,在cmsis_os.c文件中。这使得程序更简单了。


使用特权

评论回复
24
xiaoqizi|  楼主 | 2021-7-5 14:14 | 只看该作者
3.1 LED KEY 串口1 的一个实验
用cubeMX打开RCC的2个外部时钟输入
打开PC13作为LED输出
打开PB7 PB6 PB5 PB4作为按键输入
打开SYS中的serial Wire,选择TIM1作为Timebase Source(避免和freeRTOS的心跳冲突)
打开USART1并打开中断
打开中间件FREERTOS并添加2个任务进去,LED和KEY任务。
在clock configuration中选择72MHZ时钟。
生成工程。


使用特权

评论回复
25
xiaoqizi|  楼主 | 2021-7-5 14:14 | 只看该作者
添加下面代码在main.c中使得串口1支持printf

#include <stdio.h>
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (unsigned char) ch;      
        return ch;
}


使用特权

评论回复
26
xiaoqizi|  楼主 | 2021-7-5 14:15 | 只看该作者
编写任务函数:

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the LED thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);//取反
    osDelay(1000);//延时1秒钟
  }
  /* USER CODE END StartTask02 */
}
/* USER CODE BEGIN Header_StartTask03 */
/**
* @brief Function implementing the KEY thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask03 */
void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
  for(;;)
  {
                if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==0)
                {
                        while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==0);
                        printf("  press key1 \r\n");
                }
    osDelay(10);
  }
  /* USER CODE END StartTask03 */
}


任务StartTask02每隔1000ms取反小灯,任务StartTask03每次PB7按键按下向串口发送数据。


使用特权

评论回复
27
daxia769| | 2021-8-14 13:30 | 只看该作者
不错不错,支持下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则