新建工程并进行基础硬件初始化,下边直接上图
选择,GENERATE CODE ,生成代码。在keil mdk中打开工程。
二、UART使用查询方式实现rx和tx
2.1 修改board.c
增加头文件
#include "usart.h"
修改board.c文件的rt_hw_board_init()初始化函数为:
/**
* This function will initial your board.
*/
extern void SystemCoreClockUpdate(void);
extern HAL_StatusTypeDef HAL_Init(void);
void rt_hw_board_init()
{
//为了和main起初生成的代码一致,这里需要使用main.c中调用的两个函数
HAL_Init();
/* System Clock Update */
SystemCoreClockUpdate();
MX_USART1_UART_Init();
/* System Tick Configuration */
_SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}
2.2 修改uart.c
增加头文件的引用
/* USER CODE BEGIN 0 */
#include <rtthread.h>
/* USER CODE END 0 */
增加uart.h中新增两个函数的声明
/* USER CODE BEGIN Prototypes */
char rt_hw_console_getchar(void);
void rt_hw_console_output(const char *str);
/* USER CODE END Prototypes */
增加uart.h中新增两个函数的实现在uart.c中
/* USER CODE BEGIN 1 */
char rt_hw_console_getchar(void)
{
int ch = -1;
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
ch = huart1.Instance->DR & 0xff;
}
else
{
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&huart1);
}
rt_thread_mdelay(10);
}
return ch;
}
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '\r';
__HAL_UNLOCK(&huart1);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == '\n')
{
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
}
}
/* USER CODE END 1 */
修改main.c,至关重要的一步:while循环中必须添加延时rt_thread_mdelay(1000)函数,否则FISH提示符不会出现,也就无法交互。
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <rtthread.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 ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* 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. */
/* 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_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
rt_thread_mdelay(1000);//必须要有否者FISH不显示提示符
}
/* USER CODE END 3 */
}
使用putty连接单片机,FISH成功界面
后记:
在编译过程中出现如下对话框:
经在RT-Thread官方技术交流群1里咨询,得到众多好友的支持,特别感谢yangjie和Jacky为我指点,最后yangjie的方法可行,
在工程栏那个文件上面右键,查看该文件类型是不是汇编