1. CubeMX 的配置
-
配置时钟,我的时钟是8MHz
-
配置调试串口,我的板子调试串口是UART8
-
配置RTT
-
配置gpio 控制LED 3个
-
配置串口3中断DMA方式接收数据
-
配置中断的代码生成
-
调试下载口配置
2. MDK配置
-
包含 finsh_config.h 文件 在rtconfig.c文件中修改
-
启用堆内存 在rtconfig.c文件中修改
否则动态创建内核对象时候就会报错
-
修改调试串口 在board.c文件中修改
3. 使用rtt
- 包含 rtthread.h 头文件
- 点亮LED灯
- dma中断接收串口数据,释放信号量
- 使用独立的处理线程处理数据,获取信号量方式
- 使用串口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 */
}