IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32F767IGT6的RT-thread工程 -> 正文阅读

[嵌入式]基于STM32F767IGT6的RT-thread工程

RT-thread版本:4.0.1,几乎是最新版

为了能让像我一样喜欢白嫖的小伙伴能不求人借会员就可以下载到资源,我把代码的百度云链接放在文章末尾,小伙伴们可以用百度云下载。

代码使用的是串口6作为二号串口,可能有些代码是显示串口2或者3的,那是我懒得改了,忽略即可。整个工程使用设备驱动的方式调用串口6,将串口6接收到的数据从串口1输出。串口6配置函数我写在USART.c中,如果后续想要使用其他串口的话在USART.c中参照USART6_Config();的样子写一个函数就好了。

PS:由于F767的官方例程并没有串口6的相关配置,所以我是自己添加的,串口中断优先级是占用了串口5的优先级,使用串口5的话需要注意一下

keil工程文件位于RT-thread_v4.0.1\rt-thread\bsp\stm32\stm32f767-atk-apollo中,不想重复打开的话可以创建一个快捷方式

/*main.c*/
/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-06     BalanceTWK   first version
 */




#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <rtdbg.h>

#include <serial.h>
#include <USART.h>
#include <bsp_led.h>//开发板LED配置文件,PB1,0分别为LED0,1
//#include "STM32f767xx.h"



rt_device_t UART6_find;//创建任务查找句柄
struct rt_semaphore sem;//创建信号量
struct serial_configure UART6_config= RT_SERIAL_CONFIG_DEFAULT;//定义串口6参数配置结构体,这里选用默认配置
rt_thread_t UART6_th;

rt_err_t rx_callback(rt_device_t dev,rt_size_t size)//设置中断回调函数
{
		 
    rt_sem_release(&sem);//唤醒信号量
		LED1(ON);
    return RT_EOK;
}

void UART6_rec_thread_entry(void *parameter)//串口6接收线程入口
{
    char UART6_rx_buffer;
    while(1)
    {
        while(rt_device_read(UART6_find,0,&UART6_rx_buffer,1)!=1)//每接收到一个字符就触发一次中断
        {
						LED0(ON);
            rt_sem_take(&sem,RT_WAITING_FOREVER);
        }
        rt_kprintf("%c",UART6_rx_buffer);
    }
}



int main(void)
{
	
		USART6_Config();
	
    rt_err_t receive = 0;
		
	
	
    UART6_find=rt_device_find("uart6");
    if(UART6_find==RT_NULL)
    {
        rt_kprintf("UART6查找失败");
        return -ENOMEM;

    }

    receive=rt_device_open(UART6_find,RT_DEVICE_FLAG_INT_RX|RT_DEVICE_FLAG_INT_RX);//以读写+中断接收方式打开串口2设备,接收到的值传给receive
    if(receive<0)
    {
        rt_kprintf("UART6打开失败");
        return -receive;
    }
	

    rt_device_control(UART6_find,RT_DEVICE_CTRL_CONFIG,(void *)&UART6_config);
    rt_device_set_rx_indicate(UART6_find,rx_callback);
    rt_sem_init(&sem,"rx_sem",0,RT_IPC_FLAG_FIFO);//设置接收信号量,初始数据为0,接收到数据调用上面的rx_callback后信号量才会+1
		
		//创建串口6数据接收线程
    UART6_th = rt_thread_create("UART6_receive",UART6_rec_thread_entry,NULL,1024,10,5);
    if(UART6_th==RT_NULL)
    {
        rt_kprintf("UART6数据接收线程创建失败");
        return -ENOMEM;
    }
    rt_thread_startup(UART6_th);
    rt_device_write(UART6_find,0,"Uart6 tset...",rt_strlen("Uart6 tset..."));//发送字符

    return RT_EOK;
}







/*board.c*/
/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-11-06     SummerGift   first version
 */

#include "board.h"
#include "drv_common.h"
#include "drv_usart.h"

#include "USART.h"
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

    /**Configure LSE Drive Capability
    */
    HAL_PWR_EnableBkUpAccess();
    __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
    /**Configure the main internal regulator output voltage
    */
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    /**Initializes the CPU, AHB and APB busses clocks
    */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.LSEState = RCC_LSE_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLM = 25;
    RCC_OscInitStruct.PLL.PLLN = 432;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 2;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
    /**Activate the Over-Drive mode
    */
    if (HAL_PWREx_EnableOverDrive() != HAL_OK)
    {
        Error_Handler();
    }
    /**Initializes the CPU, AHB and APB busses clocks
    */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
    {
        Error_Handler();
    }
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1;
    PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
    PeriphClkInitStruct.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
}


void rt_hw_board_init()
{
#ifdef SCB_EnableICache
    /* Enable I-Cache---------------------------------------------------------*/
    SCB_EnableICache();
#endif

#ifdef SCB_EnableDCache
    /* Enable D-Cache---------------------------------------------------------*/
    SCB_EnableDCache();
#endif

    /* HAL_Init() function is called at the beginning of the program */
    HAL_Init();

    /* System clock initialization */
    SystemClock_Config();
    rt_hw_systick_init();
	
		rt_kprintf("开始串口3初始化");
	
		
		USART6_Config();
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
		//printf("finish usart3 init");
	
		
    /* Heap initialization */
#if defined(RT_USING_HEAP)
    rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif

    /* Pin driver initialization is open by default */
#ifdef RT_USING_PIN
    rt_hw_pin_init();
#endif

    /* USART driver initialization is open by default */
#ifdef RT_USING_SERIAL
    rt_hw_usart_init();
#endif

    /* Set the shell console output device */
#ifdef RT_USING_CONSOLE
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

    /* Board underlying hardware initialization */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
}

例程文件:

链接:https://pan.baidu.com/s/11J8h4v3S94OtzzYpyJfzMw?
提取码:mp5b?
--来自百度网盘超级会员V5的分享

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-09 20:51:47  更:2022-02-09 20:52:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:17:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码