当前位置: 首页 > news >正文

网站服务商是什么软件定制开发

网站服务商是什么,软件定制开发,php做网站框架,一家专做二手手机的网站叫什么手机引言 C语言中经常使用printf来输出调试信息,打印到屏幕。由于在单片机中没有屏幕,但是我们可以重定向printf,把数据打印到串口,从而在电脑端接收调试信息。这是除了debug外,另外一个非常有效的调试手段。 一、什么是pr…

引言

       C语言中经常使用printf来输出调试信息,打印到屏幕。由于在单片机中没有屏幕,但是我们可以重定向printf,把数据打印到串口,从而在电脑端接收调试信息。这是除了debug外,另外一个非常有效的调试手段。


一、什么是printf的重定向

       我们知道 C 语言中printf 函数默认输出设备是控制台,如果要实现在串口或者 LCD 上显示,必须重定义C语言标准库函数里调用的与输出设备相关的函数。比如使用 printf 输出到串口,则需要将 fputc 里面的输出指向串口,这一过程就叫 重定向

二、怎么样重定向printf

       那么如何让 STM32 使用 printf 函数呢?很简单,只需要将 fputc 里面的输出指向 STM32 串口即可,fputc 函数有固定的格式,我们只需要在函数内操作STM32串口即可。

2.1 配置microLIB

       由于我们使用的开发环境或者说工具链是keil-MDK,而在KEIL-MDK开发环境中,本身是没有包含C语言的一些标准库函数,如stdio.h这种文件等。       

       在KEIL-MDK开发环境中,可以选择使用MicroLIB库。MicroLIB是一个高度优化的C库,适用于嵌入式应用程序。它的特点是代码体积小,但功能较少,不支持某些ISO C特性。当然这里重定向printf要使用的库函数已经够用了。

我们可以直接在【魔法棒】中勾选上即可完成它的配置


2.2 重定向fputc函数(寄存器实现)

在使用MicroLIB库时,需要重定向fputc函数。fputc函数的原型如下:

int fputc(int ch, FILE* stream)
{
USART_SendChar(USART1, (uint8_t)ch);
return ch;
}

        那么,本次我们将printf重定向到串口上,这里使用的串口是USART1,只需要编写一个发送单字符数据的函数,接着重新定义一下fputc函数即可实现printf的重定向。

       也就是说,只需要在usart.c中编写三个函数,分别是串口的初始化发送一个字符函数fputc函数重写即可。

参考代码如下:

1、usart.h

#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
#include <stdio.h>// 初始化
void USART_Init(void);// 发送一个字符
void USART_SendChar(uint8_t ch);#endif

2、usart.c

#include "usart.h"// 初始化
void USART_Init(void)
{// 1. 开启GPIO时钟 PA9 PA10RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;RCC->APB2ENR |= RCC_APB2ENR_USART1EN;// 2. 设置GPIO工作模式// PA9 TX 输出,复用推挽输出 MODE-11 CNF-10// PA10 RX 输入,浮空输入 MODE-00 CNF-01GPIOA->CRH |= GPIO_CRH_MODE9;GPIOA->CRH |= GPIO_CRH_CNF9_1;GPIOA->CRH &= ~GPIO_CRH_CNF9_0;GPIOA->CRH &= ~GPIO_CRH_MODE10;GPIOA->CRH &= ~GPIO_CRH_CNF10_1;GPIOA->CRH |= GPIO_CRH_CNF10_0;// 3. 串口配置// 3.1 设置波特率USART1->BRR = 0x271;         // 115.2 Kpbs// 3.2 开启模块及收发使能USART1->CR1 |= USART_CR1_UE;USART1->CR1 |= USART_CR1_TE;USART1->CR1 |= USART_CR1_RE;// 3.3 其他配置(字长、奇偶校验、停止位)USART1->CR1 &= ~USART_CR1_M;USART1->CR1 &= ~USART_CR1_PCE;USART1->CR2 &= ~USART_CR2_STOP;
}// 发送一个字符
void USART_SendChar(uint8_t ch)
{// 当发送的数据不为空时等待,TXE为1则可以继续写入数据while ((USART1->SR & USART_SR_TXE) == 0){}// 发送一个字符USART1->DR = ch;    
}// 重定向fputc函数
int fputc(int ch, FILE * file)
{USART_SendChar((uint8_t)ch);return (int)ch;
}

3、main.c

#include "usart.h"int main(void)
{// 初始化USART_Init();// printfint a = 100;printf("a = %d", a);// 死循环保持状态while(1){		}
}

2.3 重定向fputc函数(HAL库实现)

        然后我们在借助HAL库实现。其实也非常简单,其在STM32CubeMX中需要进行的配置和前面串口通讯轮询案例的HAL库实现需要的配置是一样的,因为本次作重定向主要就只是多重写一个fputc函数,即STM32CubeMX软件自动生成代码后我们再在usart.c中添加重写fputc函数的代码即可,非常简单。

所以这里附上前面HAL库实现的串口通讯轮询案例的文章链接,可以直接去看看相关配置步骤USART_串口通讯轮询案例(HAL库实现)-CSDN博客https://blog.csdn.net/2301_79475128/article/details/145263748?spm=1001.2014.3001.5502

然后,根据上面所述原理,这里直接给上添加到usart.c中的参考代码如下:

/* USER CODE BEGIN 1 */int fputc(int ch, FILE * file)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);return ch;
}/* USER CODE END 1 */

      值得注意的是,keil中要勾选上【microLIB】代码中引入#include<stdio.h> ,否则会提示找不到printf函数。


三、测试

编译以后,我们烧录然后在串口助手中看效果

1、寄存器实现的测试

2、HAL库实现的测试

       显然,通过重定向printf,我们可以通过printf将一些信息打印发送到电脑上,使用串口助手进行查看。


以上便是本次文章的所有内容,欢迎各位朋友在评论区讨论,本人也是一名初学小白,愿大家共同努力,一起进步吧!

鉴于笔者能力有限,难免出现一些纰漏和不足,望大家在评论区批评指正,谢谢!

http://www.hengruixuexiao.com/news/10062.html

相关文章:

  • 蚌埠网站建设专业公司广州排名推广
  • 网站开发公司 重庆品牌公关
  • 怎么在dw里做网站河北网站建设推广
  • xampp 做网站企业营销平台
  • 不更新网站如何做排名站长工具怎么用
  • 大连网站建设领超最好一个企业seo网站的优化流程
  • 日本 韩国 美国 中国 动作的seo搜外
  • 专做恐怖片的网站推广哪个app最挣钱
  • 做网站和做网页的区别黄山网站seo
  • 做汽配的都上什么网站公司网站建站要多少钱
  • 济南微信网站建设做营销型网站哪家好
  • 微信微博网站建设深圳网络推广工资
  • 网站开发雷小天国外b站推广网站
  • 网站建设公司投诉电话软文兼职
  • 网站推广方式主要通过网店推广实训系统
  • 网站交互效果开个网站平台要多少钱
  • 球类网站如何做宣传百度指数平台
  • html个人博客完整代码黑河seo
  • 动漫做a视频网站有哪些百度软件中心下载安装
  • 广州有建网站的公司吗整站排名服务
  • 工商企业查询快速灰色seo推广
  • 做六个网站静态页多少钱百度知道官网入口
  • 传奇购买域名做网站巨量算数数据分析入口
  • 企业的网站建设文章windows优化大师是自带的吗
  • 建设银行人才招聘网站网络营销策划书800字
  • 区块链网站用vue.js做怎么样怎么在百度上推广产品
  • 做淘宝链接的网站游戏app拉新平台
  • 邢台做移动网站网站权重查询接口
  • 萍乡建网站爱站网权重查询
  • 餐饮网站建设服务器360建站和凡科哪个好