mdk cubemx 移植RT-Thread Nano 至stm32f424zgt6

参考文章:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-cube/an0041-nano-port-cube

1. CubeMX 的配置

  1. 配置时钟,我的时钟是8MHz在这里插入图片描述在这里插入图片描述

  2. 配置调试串口,我的板子调试串口是UART8在这里插入图片描述

  3. 配置RTT在这里插入图片描述在这里插入图片描述在这里插入图片描述

  4. 配置gpio 控制LED 3个在这里插入图片描述

  5. 配置串口3中断DMA方式接收数据在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  6. 配置中断的代码生成在这里插入图片描述
    在这里插入图片描述

  7. 调试下载口配置在这里插入图片描述

2. MDK配置

  1. 包含 finsh_config.h 文件 在rtconfig.c文件中修改
    在这里插入图片描述

  2. 启用堆内存 在rtconfig.c文件中修改在这里插入图片描述
    否则动态创建内核对象时候就会报错
    在这里插入图片描述

  3. 修改调试串口 在board.c文件中修改在这里插入图片描述

3. 使用rtt

  1. 包含 rtthread.h 头文件
  2. 点亮LED灯
  3. dma中断接收串口数据,释放信号量
  4. 使用独立的处理线程处理数据,获取信号量方式
  5. 使用串口3发送 0xa5,0x50 给传感器,传感器返回数据 a5 5a 14 00 00 00 04 71 00 01 12 c1 94 ed 93 c5 e1 9f d2 c7 eb 9b f3 33 4c 42 73 在这里插入图片描述
#include <rtthread.h>
#include <rtconfig.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim1;

UART_HandleTypeDef huart8;
UART_HandleTypeDef huart3;
DMA_HandleTypeDef hdma_usart3_rx;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_UART8_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_TIM1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

#define CACHE_LEN 27
uint8_t uart3_data[CACHE_LEN];

static rt_sem_t dynamic_sem = RT_NULL;

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5
static char thread2_stack[1024];
static struct rt_thread thread2;


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    
    
	rt_interrupt_enter();
	
	HAL_UART_Receive_DMA(&huart3,uart3_data,CACHE_LEN);
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);
	 rt_sem_release(dynamic_sem);
	rt_interrupt_leave();
}



static void thread2_entry(void *param)
{
    
    
	 static rt_err_t result;
    rt_uint32_t count = 0;
		while(1)
		{
    
    
	  result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);
	   if (result == RT_EOK)
		 {
    
    
				rt_kprintf("uart3 read: ");
				for (count = 0; count < CACHE_LEN ; count++)
				{
    
    
						/* 线程 2 打印计数值 */
						rt_kprintf("%02x ", uart3_data[count]);
				}
				rt_kprintf("\r\n");
		 
		 }
    /* 线程 2 拥有较高的优先级,以抢占线程 1 而获得执行 */
   }
   
    /* 线程 2 运行结束后也将自动被系统脱离 */
}


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_UART8_Init();
  MX_USART3_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */


	HAL_UART_Transmit(&huart3,"hello\r\n",7,1000);
	HAL_UART_Receive_DMA(&huart3,uart3_data,CACHE_LEN);
	
	
	dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_PRIO);
		
    if (dynamic_sem == RT_NULL)
    {
    
    
        rt_kprintf("create dynamic semaphore failed.\n");
        return -1;
    }
    else
    {
    
    
        rt_kprintf("create done. dynamic semaphore value = 0.\n");
    }
		 rt_thread_init(&thread2,
                   "thread2",
                   thread2_entry,
                   RT_NULL,
                   &thread2_stack[0],
                   sizeof(thread2_stack),
                   THREAD_PRIORITY - 1, THREAD_TIMESLICE);
    rt_thread_startup(&thread2);
									 
		uint8_t data[] = {
    
    0xa5,0x50};
		
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
		rt_thread_mdelay(1000);
		
		HAL_UART_Transmit(&huart3,data,3,1000);
		
  }
  /* USER CODE END 3 */
}

猜你喜欢

转载自blog.csdn.net/u010261063/article/details/121189527