- 2023-06-02
-
回复了主题帖:
【极海APM32F407】 3. 极简方式集成FreeRTOS
nmg 发表于 2023-6-2 16:46
看起来好轻松的样子
是的,用KEIL自带的CMSIS-FreeRTOS包,集成起来很简单。感谢管理员大佬支持
-
回复了主题帖:
祝大家六一快乐!EEWorld喊你用芯积分兑换六一专属礼品啦!
可以可以,刚好够兑换一个怀旧大礼包
-
发表了主题帖:
【极海APM32F407】 3. 极简方式集成FreeRTOS
本帖最后由 hehung 于 2023-6-2 11:28 编辑
[【极海APM32F407】 1. 开箱啦](http://bbs.eeworld.com.cn/thread-1244122-1-1.html)
[【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向](http://bbs.eeworld.com.cn/thread-1244768-1-1.html)
# 前言
FreeRTOS作为一款开源的嵌入式实时操作系统,广泛的运用在嵌入式行业,在芯片中集成嵌入式系统也是很有必要的一件事,可以方便的处理各个任务之间的关系,进行精确地时间控制等。本文将讲解如何在APM32F407中集成FreeRTOS OS。
开发环境:
- 系统:win10
- IDE:KEIL V5.34
- 单片机:APM32F407
- freeRTOS:KEIL集成包CMSIS-FreeRTOS V10.5.1
# 1 准备工作
## 1.1 下载FreeRTOS
KEIL中是集成了FreeRTOS系统的,可以直接在 `Pack Installer`中安装,如下图,点击 `Install`即可。这样就不用去freeRTOS官网下载整个freeRTOS包了。简单方便快捷。

下载过程中可能出现超时的问题,导致下载不成功,因为keil官网从国内访问不是很稳定。

出现上述情况,可以直接在keil官网去下载,使用迅雷要快很多,下载好了之后直接双击pack包安装即可。
官方地址:[http://www.keil.com/pack/](http://www.keil.com/pack/)

## 1.2 集成freeRTOS到工程
1. 下载好freeRTOS的CMSIS-pack包之后,双击安装即可。
2. 安装完成之后,随便选择一个官方示例工程,接着下一步
3. 打开工程,选择 `Manage Run-Time Environment`,选择 `RTOS`,配置相关信息,见下图:

> 不要管上图中出现的警告消息,提示的是没有内核启动代码,我们工程中是有的,不用管
4. 编译,出现下面的错误,原因是KEIL自动添加的FreeRTOSConfig.h将 `configUSE_TIMERS`设置为了0,修改为1即可。

5. 再次编译,出现了下面的错误,提示下属三个函数重定义了,因为FreeRTOS实现了这三个函数,所以我们需要将工程中默认提供的这三个函数删除掉,这三个函数在文件 `apm32f4xx_int.c`中。

6. 再次编译,OK了,接下面就是写一个写两个任务看看能不能跑起来了。
# 2 代码实现
下面实现了两个任务:led1_task和led2_task,分别驱动LED2和LED3闪烁,led1_task的工作周期为500ms,led2_task的工作周期为1000ms。
因为freeRTOS用到了systick,所以需要初始化,实现函数 `SysTick_Init();`。
```c
/*
@hehung
2023-5-22
email: 1398660197@qq.com
wechat: hehung95
reproduced and please indicate the source @hehung
*/
#include "main.h"
#include "Board.h"
#include "app_uart.h"
/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"
#define LED1_TASK_PRIO 3 //任务优先级
#define LED1_STK_SIZE 50 //任务堆栈大小
TaskHandle_t LED1Task_Handler; //任务句柄
void led1_task(void *pvParameters); //任务函数
#define LED2_TASK_PRIO 3 //任务优先级
#define LED2_STK_SIZE 50 //任务堆栈大小
TaskHandle_t LED2Task_Handler; //任务句柄
void led2_task(void *pvParameters); //任务函数
void SysTick_Init(void);
/*!
* @brief Main program
*
* @param None
*
* @retval None
*/
int main(void)
{
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
USART_Init();
printf ("APM32F407 freeRTOS test\r\n");
/** SysTick Initialization */
SysTick_Init();
//创建led1任务
xTaskCreate((TaskFunction_t )led1_task, //任务函数
(const char* )"led1_task", //任务名称
(uint16_t )LED1_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )LED1_TASK_PRIO, //任务优先级
(TaskHandle_t* )&LED1Task_Handler); //任务句柄
//创建led1任务
xTaskCreate((TaskFunction_t )led2_task, //任务函数
(const char* )"led2_task", //任务名称
(uint16_t )LED2_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )LED2_TASK_PRIO, //任务优先级
(TaskHandle_t* )&LED2Task_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
while(1)
{
}
}
void led1_task(void *pvParameters)
{
while(1)
{
APM_TINY_LEDToggle(LED2);
vTaskDelay(500);
}
}
void led2_task(void *pvParameters)
{
while(1)
{
APM_TINY_LEDToggle(LED3);
vTaskDelay(1000);
}
}
void SysTick_Init(void)
{
/** SystemFrequency / 1000 = 1ms */
if (SysTick_Config(SystemCoreClock / 1000))
{
/** Capture error */
while (1);
}
}
```
# 3 实验效果
如下图所示,LED2闪烁两次,LED1才会闪烁一次,实验成功。

-
回复了主题帖:
【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向
lugl4313820 发表于 2023-6-1 08:57
何老师的scanf的教程非常好,在评测帖里,很少看到的scanf的例子,非常感谢分享!
感谢大佬捧场
- 2023-05-29
-
回复了主题帖:
【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向
wangerxian 发表于 2023-5-29 10:03
打印浮点型怎么样?
没问题的,亲测浮点数打印正确
- 2023-05-28
-
回复了主题帖:
【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向
caizhiwei 发表于 2023-5-28 08:02
Keil倒是简单,中规中矩,fputc 即可。
但是你用IAR9.30的时候,你会发现,又翻车了!
IAR没试过,后边有机会试一下
- 2023-05-26
-
发表了主题帖:
【极海APM32F407】2. KEIL下实现printf和scanf对串口的重定向
# 前言
printf和scanf是学习C语言是首先会接触的内容。在单片机上也可以使用这两个函数实现打印功能,需要结合串口实现,也需要IDE支持,不同的IDE实现scanf接收和printf打印的方法是不一样的。本文将讲解如何使用KEIL实现printf和scanf。
本文试验的测试环境:
- 系统:win10
- IDE:KEIL V5.34
- 单片机:极海APM407IGT6
# 1 硬件连接
首先是确定串口连接,下载APM407的数据手册,可以看到USART1连接到了PA9(TX)和PA10(RX)上,正好官方提供的例程也是使用的USART1,所以将官方例程直接拿过来修改完成我们需要的功能即可。
连接线路如下:
| USB-TTL | APM32F407 |
| ------- | --------- |
| RX | PA9 |
| TX | PA10 |
| GND | GND |
> 注:官方例程是基于MINI开发板的,我们这块是TINY开发板,所以使用的库是不一样的,需要修改,后面讲述方法。
# 2 软件代码编写
要实现printf和scanf,本质上是实现fputc和fgetc函数。
需要实现对单个字符的接收和发送即可。实现代码如下:
```c
// fputs for printf or other print function in standard
int fputc(int ch, FILE *f)
{
(void)f;
/** Wait until end of transmission */
USART_TxData(TINY_COM1, (uint8_t)ch);
while(USART_ReadStatusFlag(TINY_COM1, USART_FLAG_TXBE) == RESET) {};
return ch;
}
// fgets for scanf or other input function in standard
int fgetc(FILE *f)
{
uint8_t ch;
(void)f;
while(USART_ReadStatusFlag(TINY_COM1, USART_FLAG_RXBNE) == RESET) {};
ch = USART_RxData(TINY_COM1);
return (int)ch;
}
```
主函数实现如下:
功能:
- 初始化LED2和LED3,上电时为熄灭状态
- 初始化串口USART1,波特率为115200
- 打印信息到串口,然后从串口接收一个整数并通过串口打印出来
- 完成之后LED2和LED3亮
```c
int main(void)
{
APM_TINY_LEDInit(LED2);
APM_TINY_LEDInit(LED3);
USART_Init();
printf ("APM32F407 printf test\r\n");
printf ("Please input a number with int type\r\n");
int a;
scanf ("%d", &a);
printf ("The number you input is: %d", a);
APM_TINY_LEDOn(LED2);
APM_TINY_LEDOn(LED3);
while(1)
{
}
}
```
# 3 注意事项
## 3.1 勾选 Use MicroLIB
如果需要成功使用 `printf`和 `scanf`功能,需要勾选 `Use MicroLIB`使用KEIL的内置库,不然使用printf和scanf的时候会导致程序卡死。
## 3.2 修改编译器宏
官方提供的Demo程序使用的是MINI板子的代码,我们的板子是TINY板子,所以需要修改KEIL编译器宏为 `APM32F407_TINY`,用来定位到TINY板子所包含的头文件。
> 注:代码中关于MINI的部分都修改为TINY即可。
# 4 实现效果
如下,测试成功,后续就可以使用printf来打印以及使用scanf来接收命令了。
- 2023-05-25
-
回复了主题帖:
【极海APM32F407】 1. 开箱啦
damiaa 发表于 2023-5-23 21:59
楼主加油
感谢支持
-
回复了主题帖:
【极海APM32F407】 1. 开箱啦
lugl4313820 发表于 2023-5-23 16:40
何总,大佬,你还有闲来无事,太谦虚了吧!
- 2023-05-23
-
回复了主题帖:
【极海APM32F407】 1. 开箱啦
lugl4313820 发表于 2023-5-23 07:33
大佬 参与这个评测看来精彩作品就要来了!
过奖了,最近闲来无事,申请下来玩玩
- 2023-05-22
-
加入了学习《极海APM32F407技术微课堂》,观看 APM32F407 USB2.0通信应用讲解
-
回复了主题帖:
【极海APM32F407】 1. 开箱啦
caizhiwei 发表于 2023-5-22 18:48
楼主加油~~
感谢支持
-
回复了主题帖:
兆易一下发布3款M7的MCU,GD32H737/757/759系列
整起来
-
发表了日志:
【极海APM32F407】 1. 开箱啦
-
发表了主题帖:
【极海APM32F407】 1. 开箱啦
开箱
周一上班就收到了快递,趁着午休的时候赶紧拆开来看看,APM32F407被一个气泡袋包着,并且放在一个透明的盒子中,很好的解决了快递过程中防撞的问题。这个好评。
包装盒里面还有一个卡片,背面介绍了APM32F407的特点,板载资源,上手说明,支持OS,支持工具链等相关内容。通过查看这个卡片,就可以大致了解APM32F407这款单片机,并且让初次接触这款单片机的小伙伴知道从哪里入手。好评+1。
打开盒子是单片机APM32F407,板子不算小巧,可以是需要引出所有引脚的原因,板载算是比较大的。
可以看到上半部分是一块板载调试器,不用外接调试设备。这对用户及其友好,剩下了购买调试器的钱,哈哈。好评+1。
而且就算后边不想用板载调试器,也可以通过跳线以及板载扩展引脚连接自己的调试器。好评+1。
板子下半部分是核心板以及引出引脚(共134个)。所有引脚均做了引出,方便扩展。好评+1。
还提供了arduino引脚扩展。好评+1。
其他板载外设资源包括了:
2个按键
2个LED
板子背面什么也没有。
总结
极海APM32F407开发板整体为黑色,显得高大上,引出了所有外设,方便扩展,是比较符合我期望的一款板子,板载资源也比较丰富,主频高达168MHz,可以满足绝大部分单片机应用场景了。后期就开始学习搭建环境学习起来了。
- 2023-05-19
-
回复了主题帖:
测评入围名单:极海APM32F407 Tiny Board
个人信息无误,确认可以完成评测计划
-
回复了主题帖:
【GD32L233C-START评测】14. CAU加密算法之AES
fffqw123 发表于 2023-5-19 01:52
有函数cau_aes_ecb源码吗?
cau_aes_ecb是官方库文件提供的
- 2023-03-08
-
回复了主题帖:
3月7日,ST推出新品基于M33内核的STM32H5,你感兴趣吗?
1
- 2023-02-15
-
回复了主题帖:
(已全部安排派发)颁奖:寻找身边8位单片机,抢楼赢ST最新M0开发板活动
恭喜各位大佬
- 2023-02-13
-
回复了主题帖:
【开工大吉,抢楼有礼】聊一聊你感兴趣的技术和板子
推荐测试一些国产板子