阿飞的秘术屋
认证:VIP会员
作者动态
emc防护原理
01-14 21:20
关于使用LVDS芯片进行屏幕通信过程中遇到的EMC问题
2023-12-25 13:15
RT-Thread 串口DMA发送代码解析
2023-12-21 16:58
滤波、去耦、旁路、储能傻傻分不清
2022-12-06 22:15
STM32H750使用LTDC驱动RGB屏幕显示
2022-03-20 14:16

FREERTOS-1-移植

1、参考

安富莱FREERTOS教程(F103)、安富莱F4系列BSP库、战舰原理图

相关产出:如何添加HA库相关.C.H文件

2、硬件平台

正点原子-战舰平台,keil。

3、移植目标

将F4的HAL,BSP代码库移植到F1中。同时完成FreeRTOS移植,并通过串口将FreeRTOS的线程运行状态通过串口打印出来。

4、移植过程

通过CUbemx软件创建F103标准模板文件,通过《安富莱FREERTOS教程(F103)》、安富莱F103FREE例程将相关源码进行复制,实现FreeROTS移植。移植完成之后,通过设置GPIO引角点亮LED灯,检测移植是否完成。(备注:本次所使用的代码,在GPIO外设上使用的BSP库,也可以不使用直接使用HAL库在线程里面控制)

有了模板之后,通过参考《安富莱F4系列用户手册》,安富莱F4BSP库代码,将BSP库移植到战舰开发板中,在移植过程中主要修改一下内容:

1、key相关,同时LED文件也需要相关的修改,和key。c文件差不多,关于串口文件,只需要将文件移植过去之后,修改至编译通过即可。

#define HARD_KEY_NUM	    1	   				/* 实体按键个数 */
#define KEY_COUNT   	 	(HARD_KEY_NUM + 0)	/* 4个独立建 + 2个组合按键 */

/* 使能GPIO时钟 */
#define ALL_KEY_GPIO_CLK_ENABLE() {	\
		__HAL_RCC_GPIOA_CLK_ENABLE();	\
		__HAL_RCC_GPIOE_CLK_ENABLE();	\
	};

/* GPIO和PIN定义 */
static const X_GPIO_T s_gpio_list[HARD_KEY_NUM] = {
//	{GPIOE, GPIO_PIN_2,  0},	/* K1 */
	{GPIOE, GPIO_PIN_3,  0},	/* K2 */
//	{GPIOE, GPIO_PIN_4,  0},	/* K3 */
//	{GPIOA, GPIO_PIN_0,  1},	/* K4 */	
};	

/*一下需要注意一下,安富莱在板子上添加了上拉电阻,但是战舰的板子没有添加,在按键初始化的时候,需要根据实际情况设置上拉和下拉*/
static void bsp_InitKeyHard(void)
{	
	GPIO_InitTypeDef gpio_init;
	uint8_t i;

	/* 第1步:打开GPIO时钟 */
	ALL_KEY_GPIO_CLK_ENABLE();
	
	/* 第2步:配置所有的按键GPIO为浮动输入模式(实际上CPU复位后就是输入状态) */
	gpio_init.Mode = GPIO_MODE_INPUT;   			/* 设置输入 */
	gpio_init.Pull = GPIO_PULLUP;                 /* 上下拉电阻不使能 */
	gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;  /* GPIO速度等级 */
	
	for (i = 0; i < HARD_KEY_NUM; i++)
	{
		gpio_init.Pin = s_gpio_list[i].pin;
		HAL_GPIO_Init(s_gpio_list[i].gpio, &gpio_init);	
	}
	
//	gpio_init.Pull = GPIO_PULLDOWN;                 /* 上下拉电阻不使能 */
//	gpio_init.Pin = s_gpio_list[3].pin;
//	HAL_GPIO_Init(s_gpio_list[3].gpio, &gpio_init);
	
}

2、定时器相关,在系统进行监测线程的时候需要一个,更短时间间隔的计数,在这里使用定时器实现。在bsp_timer_pwm.c文件只使用到了bsp_SetTIMforInt();该函数,在编译时会有报错,将报错注释掉即可。同时编写相关的中断函数,实现ulHighFrequencyTimerTicks的计数。

/*
*********************************************************************************************************
*	函 数 名: vSetupTimerTest
*	功能说明: 创建定时器
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void vSetupSysInfoTest(void)
{
	bsp_SetTIMforInt(TIM6, timerINTERRUPT_FREQUENCY, timerHIGHEST_PRIORITY, 0);
}

/*
*********************************************************************************************************
*	函 数 名: TIM6_IRQHandler
*	功能说明: TIM6中断服务程序。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void TIM6_IRQHandler( void )
{
	if((TIM6->SR & TIM_IT_UPDATE)!= RESET)
	{
		ulHighFrequencyTimerTicks++;
		TIM6->SR = (uint16_t)~TIM_IT_UPDATE;
	}
}

5、最后效果

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 1
关注 9
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧