Nucleo-F411RE (STM32F411)LL库体验 4 -Letter Shell移植与调试

news2024/11/25 13:22:51

Nucleo-F411RE (STM32F411)LL库体验 4 -Letter Shell移植与使用

1、串口的初始化

Nucleo-F411RE自带st-link,并支持虚拟串口的功能,根据原理图,st-link的rx tx接到了Nucleo-F411RE的PA2 PA3,所以我们要初始化PA2 PA3为串口功能,这样我们就可以直接用st-link抓取打印,而不用再接一个usb转串口的模块。
在这里插入图片描述
在这里插入图片描述
由于要用letter shell,所以要配置串口为tx rx模式,发送数据我们用普通轮询模式,接收数据用中断模式,中断函数每次接收到一个数据调用一次,我们在中断函数里调用 shellHandler(&shell, received_char)去处理数据即可。

a、串口时钟初始化

所有时钟的初始化,都放在了clock_init.c中的
void BOARD_ClockInit函数中
在这里插入图片描述

b、gpio 、usart初始化

// 初始化PA2 PA3作为打印串口使用
static void Board_ConsoleInit(void)
{
    LL_RCC_ClocksTypeDef rccClock;

	/* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */
	LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_2, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_2, LL_GPIO_AF_7);
	LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_2, LL_GPIO_SPEED_FREQ_HIGH);
	LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_2, LL_GPIO_OUTPUT_PUSHPULL);
	LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_2, LL_GPIO_PULL_UP);

	/* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */
	LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_3, LL_GPIO_MODE_ALTERNATE);
	LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_3, LL_GPIO_AF_7);
	LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_3, LL_GPIO_SPEED_FREQ_HIGH);
	LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_3, LL_GPIO_OUTPUT_PUSHPULL);
	LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_3, LL_GPIO_PULL_UP);

	/* (3) Configure USART functional parameters ********************************/
	
	/* Disable USART prior modifying configuration registers */
	/* Note: Commented as corresponding to Reset value */
	// LL_USART_Disable(USART2);
  	NVIC_SetPriority(USART2_IRQn, 0);  
  	NVIC_EnableIRQ(USART2_IRQn);
	/* TX/RX direction */
	LL_USART_SetTransferDirection(USART2, LL_USART_DIRECTION_TX_RX);

	/* 8 data bit, 1 start bit, 1 stop bit, no parity */
	LL_USART_ConfigCharacter(USART2, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);

    LL_RCC_GetSystemClocksFreq(&rccClock);
	LL_USART_SetBaudRate(USART2, rccClock.PCLK1_Frequency, LL_USART_OVERSAMPLING_16, 115200); 

  	/* Enable RXNE and Error interrupts */
  	LL_USART_EnableIT_RXNE(USART2);
  	LL_USART_EnableIT_ERROR(USART2);
	/* (4) Enable USART *********************************************************/
	LL_USART_Enable(USART2);
}

c、中断处理函数

在这里插入图片描述

d、printf重定向

在这里插入图片描述
后面完善letter shell写函数的时候,跟这个类似,直接复制过去就行。

2、letter shell的移植

下载传送门
下载后,将src中所有的文件拷贝到我们的工程中,并新建shell_port.c shell_port.h文件,目录结构如图:
在这里插入图片描述
shell_port.c 中内容如下:
#include “shell_port.h”

#include "shell.h"
#include "shell_port.h"

Shell shell;
char shell_buffer[512];

short userShellWrite(char *data, unsigned short len)
{
    uint32_t i;
	for (i = 0; i < len; i++)
	{
		while (!LL_USART_IsActiveFlag_TXE(USART2))
		{

		}
		/* If last char to be sent, clear TC flag */
		if (i == (len - 1))
		{
			LL_USART_ClearFlag_TC(USART2); 
		}

		/* Write character in Transmit Data register.
		TXE flag is cleared by writing data in DR register */
		LL_USART_TransmitData8(USART2, data[i]);
  	}
    return len;
}

void User_Shell_Init(void)
{
    shell.write = userShellWrite;
    shellInit(&shell, shell_buffer, 512);
}

shell_port.h内容如下:

#ifndef __SHELL_PORT_H__
#define __SHELL_PORT_H__
#include "shell.h"
#include "main.h"

extern Shell shell;
void User_Shell_Init(void);
#endif

main函数添加shell的初始化函数
在这里插入图片描述
如果此时编译报错,修改ld文件如下:
在这里插入图片描述

这样开机后,接到letter shell交互界面了。
在这里插入图片描述

3、Letter Shell的使用

我们添加一个命令,来控制LED灯,输入LED On灯亮,输入LED Off灯灭,
输入LED Blink 100,灯开始间隔100ms开始闪烁。
首先在shell_cfg.h使能支持外部命令的宏。
在这里插入图片描述
添加LED命令:

volatile static bool isBlinking = false;
volatile static long delay_time = 250;

int LED_Control(int argc,char *argv[])
{
    if (argc == 2)
	{
		if (!strncmp(argv[1],"On",2))
		{
			isBlinking = false;
			LED_ON();
		}
		else if (!strncmp(argv[1],"Off",3))
		{
			isBlinking = false;
			LED_OFF();
		}
		else
		{
			printf(" param error.please use LED On/LED Off/LED Blink 200\r\n");
			return -1;
		}
	}
	else if (argc == 3)
	{
		if(!strncmp(argv[1],"Blink",5))
		{
			delay_time = strtol(argv[2],NULL,10);
			if (delay_time > 0)
			{
				isBlinking = true;
			}
			else
			{
				isBlinking = false;
				printf("please LED Blink 200 \r\n");
				LED_OFF();
				return -1;
			}
		}
		else
		{
			printf(" param error.please use LED On/LED Off/LED Blink 200\r\n");
			return -1;
		}
	}
	else
	{
		printf(" param error.please use LED On/LED Off/LED Blink 200\r\n");
		return -1;
	}
    return 0;
}

SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), LED, LED_Control, LED_Control);

编译后重新烧录,在串口中输入相关命令,即可控制LED灯,这样调试是不是很方便。
在这里插入图片描述

4 、代码

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

以太网MII、RMII、GMII、RGMII(三)

目录 一、MII 二、RMII 三、GMII 四、RGMII 以太网硬件主要包括OSI的最下面两层&#xff0c;物理层和数据链路层&#xff0c;前者的芯片为PHY&#xff0c;后者的芯片为MAC控制器。而MAC与PHY之间的常用的数据传输接口有MII、RMII、GMII、RGMII。 模式 时钟 位宽 速率 M…

pytorch笔记:transformer 源码

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN seq2seq 可以是 CNN&#xff0c;RNN&#xff0c;transformer nn.Transformer 关键源码&#xff1a; encoder_layer TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, ba…

5.vue3医疗在线问诊项目 - _极速问诊-前置准备 ==> 需求分析、枚举类型、pinia仓库的初始化

5.vue3医疗在线问诊项目 - _极速问诊-前置准备 > 需求分析、枚举类型、pinia仓库的初始化 极速问诊-需求分析{#consult-product} 极速问诊阶段流程分析 线下看病流程&#xff1a; 选择医院&#xff08;三甲、普通&#xff09;》挂号》选择科室 》选择医生&#xff08;专家…

牛客网专项练习——C语言错题集(5)

文章目录 指针的值指针与数组、函数的组合空结构体* 和 的优先级 指针的值 指针的值是一个地址&#xff0c;题目中的字符串 “girl” 应该是 *p 的值&#xff0c;即指针 p 所指地址存储的数据的值。 指针与数组、函数的组合 int *p[n] 等价于 int (*)p[n]&#xff0c;是一个…

xinput1_3.dll丢失怎么办?xinput1_3.dll丢失的修复方法

xinput1_3.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开软件或者游戏的时候&#xff0c;电脑提示xinput1_…

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042

STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 Proteus仿真小实验&#xff1a; STM32 Proteus仿真自动刹车系统超声波测距电机控制-0042 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 LCD1602显示器HCSR04超声波传感器按键(加 减)电机蜂鸣器 1.单片机…

学习Angular的编程之旅

目录 1、简介 2、特点 2.1 横跨多种平台 2.2 速度与性能 2.3 美妙的工具 3、Angular 应用&#xff1a;知识要点 3.1 组件 3.2 模板 3.3 依赖注入 4、与其他框架的对比 1、简介 Angular 是一个应用设计框架与开发平台&#xff0c;旨在创建高效而精致的单页面应用。 A…

Java(二):Spring Boot 项目-文件的增删改查下载

Spring Boot 项目-文件的增删改查下载 准备docker运行mysql设置MySQL时区查看当前MySQL使用的时区MySQL建库建表 定义两个实体类数据表实体类查询条件实体类 工具类com/example/user/utils/FileUtil.java 用到的SQL语句mapper user/src/main/resources/mapper/FileTableDao.xml…

基于SSM框架的Java的医院管理系统的设计与实现+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于SSM框架的Java的医院管理系统的设计与实现文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 摘 要 随着互联网技术的快速进…

ARM-驱动

字符设备驱动的内部实现&#xff1a; 文件存在文件系统中&#xff0c;会有一个标识inode号&#xff0c;基于这个标识找到了struct_inode结构体&#xff08;保存当前文件信息&#xff09;&#xff0c;struct_inode结构体中有一个struct cdev *i_cdev类型的字符设备指针&#x…

糖基化修饰1240252-34-9,Fmoc-Thr((Ac4Galβ1-3)Ac3GlcNAcβ1-6AcGalNAcα)-OH,反应特点及性质研究

文章关键词&#xff1a;糖化学试剂&#xff0c;多肽合成&#xff0c;Fmoc-保护氨基酸&#xff0c;糖基化修饰 Fmoc-Thr((Ac4Galβ1-3)Ac3GlcNAcβ1-6AcGalNAcα)-OH &#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09;​ 一、Product stru…

Golang每日一练(leetDay0098) 生命、Nim、猜数字游戏

目录 289. 生命游戏 Game Of Life 292. Nim 游戏 Nim Game 299. 猜数字游戏 Bulls and Cows &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 289. 生命游戏 Game Of L…

牛客小白月赛56

今天无聊vp了一下 A.省略 B.最优肯定是全部都是1 C.直接统计每个余数下可以填多少个数&#xff0c;然后排序从小到大的排序输出即可 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #inc…

Linux yum常用命令

Linux服务器安装成功后&#xff0c;我们会经常使用yum安装rpm包以满足使用的需要。使用yum源安装rpm包有两种方式&#xff1a; 方式一&#xff1a; 搭建本地yum源环境&#xff0c;进行rpm包的安装&#xff0c;具体搭建方式&#xff0c;参考(chapter-5)&#xff1a; Linux常规…

Android12之如何查看hidl服务(一百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

关闭网络钓鱼攻击 - 类型、方法、检测、预防清单

在当今互联互通的世界中&#xff0c;数字通信和交易占主导地位&#xff0c;网络钓鱼攻击已成为一种无处不在的威胁。 通过伪装成可信赖的实体&#xff0c;网络钓鱼攻击欺骗用户和组织泄露敏感信息&#xff0c;例如密码、财务数据和个人详细信息。 网络钓鱼攻击是网络罪犯使用…

【SpringCloud入门】-- 认识SpringCloudAlibabaNacos服务注册和配置中心

目录 1.Nacos是什么&#xff1f; 2.Nacos能干什么&#xff1f; 3. 各种服务注册中心比较 4.Nacos安装与运行 5.介绍一下Nacos图形化界面 6.NameSpace&#xff0c;Group&#xff0c;Data ID三者的关系&#xff1f;为什么这样设计&#xff1f; 7.Nacos集群和持久化配置 前…

MATLAB与自动化控制:控制系统设计、仿真和实现的应用和优化

章节一&#xff1a;介绍 自动化控制系统是现代工程中的关键组成部分&#xff0c;它在许多领域中发挥着重要作用&#xff0c;如机械工程、电气工程和航空航天工程等。在控制系统设计、仿真和实现过程中&#xff0c;MATLAB成为了一种强大的工具。本文将探讨MATLAB在自动化控制中…

用户模块封装数据模型层

数据模型层 数据模型层&#xff08;Data Model Layer&#xff09;是指在应用程序中用于表示和处理数据的模型层。这一层通常是应用程序的核心&#xff0c;因为它 负责从各种数据源获取数据并保证这些数据与应用程序的功能相匹配 。 在一个应用程序中&#xff0c;数据模型层通…

MidJourney使用教程:二 初识Prompts

最近AIGC这么火&#xff0c;除了chatGPT以外&#xff0c;这种图像类的产品也是非常有意思&#xff0c;其中就有MidJourney和Stable Diffusion这俩个比较出圈。这里我先选择MidJourney来体验并整理出一个教程。一方面MidJourney最简单&#xff0c;能当路Discord&#xff0c;注册…