STM32串口读写迪文屏8位、16位、32位数据(应用层实现)

合集下载

独立操作STM32F103的GPIO组半字节(8位)方法

独立操作STM32F103的GPIO组半字节(8位)方法

怎么对高八位或低八位写值而不影响其它位,还有怎样单独读取高八位或低八位的值((u8*)(&GPIOB->ODR))[0] = 0xaa;写低八位g_io_tempvalue =((u8*)(&GPIOB->ODR))[1];读高八位写高八位GPIOB->CRH &= 0X00000000;GPIOB->CRH |= 0X33333333;GPIOB->ODR |= 0XFF00;低八位也一样,做与或者或运算的时候就可以避免影响不想改变的位。

读高八位:u8 temp;temp = ((GPIOB->IDR>>8)&0xff)读低八位:temp = ((GPIOB->IDR&0xff)使用BSRR和BRR寄存器直接操作STM32的I/O端STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'。

GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置'1'则端口x的对应位被清'0';寄存器中的位置'0',则对它对应的位不起作用。

GPIOx_BSRR的低16位中每一位也对应端口x的每个位,对低16位中的某位置'1'则它对应的端口位被置'1';寄存器中的位置'0',则对它对应的端口不起作用。

简单地说GPIOx_BSRR的高16位称作清除寄存器,而GPIOx_BSRR的低16位称作设置寄存器。

另一个寄存器GPIOx_BRR只有低16位有效,与GPIOx_BSRR的高16位具有相同功能。

举个例子说明如何使用这两个寄存器和所体现的优势。

例如GPIOE的16个IO都被设置成输出,而每次操作仅需要改变低8位的数据而保持高8位不变,假设新的8位数据在变量Newdata中,这个要求可以通过操作这两个寄存器实现,STM32的固件库中有两个函数GPIO_SetBits()和GPIO_ResetBits()使用了这两个寄存器操作端口。

STM32串口教程

STM32串口教程

STM32串口教程STM32是一种基于ARM Cortex-M内核的32位微控制器系列。

它具有强大的处理能力和丰富的外设接口,适用于各种嵌入式应用。

其中,串口通信是STM32常用的外设之一,可以用于和其他设备进行数据的收发。

本文将介绍STM32串口的配置和使用方法。

一、串口的基本原理串口是一种以串行方式传输数据的通信方式。

在串口通信中,数据按照比特位的顺序传输,一次传输一个位。

数据的传输包括一个或多个字节,每个字节由8位组成,其中包括1位起始位、1位停止位和可选的奇偶校验位。

串口通信需要两根信号线,一根用于发送数据(TX),一根用于接收数据(RX)。

二、STM32串口的配置配置串口的步骤如下:1.设置GPIO引脚功能和模式:将串口的引脚配置为复用功能,并设置引脚的模式为推挽输出。

2.使能串口时钟:根据串口的编号,使能对应串口的时钟。

3.配置串口参数:设置串口的波特率、数据位、停止位、奇偶校验位等参数。

4.使能串口:使能串口的发送和接收功能。

三、STM32串口的使用方法配置完成后,即可使用STM32的串口进行数据的收发。

下面是使用STM32串口的一般流程:1.发送数据:将要发送的数据写入到串口的发送缓冲区,等待数据发送完成。

2.接收数据:检测是否有数据接收到,如果有则读取数据。

在发送数据时,可以使用printf函数实现方便的格式化输出。

为了使用printf函数,需要先配置printf函数的底层接口。

可以使用标准库提供的函数重定向方法,将输出重定向到串口。

在接收数据时,可以使用中断方式或轮询方式。

中断方式需要配置串口的中断,并在中断服务函数中处理接收到的数据。

轮询方式是在主循环中不断检测数据是否接收到,并进行读取。

四、常见问题及解决方法1.串口通信乱码问题:可能是波特率设置不正确导致的,可以检查波特率设置是否和目标设备匹配。

2.串口接收数据丢失问题:可能是接收缓冲区溢出导致的,可以增加接收缓冲区的大小或者使用中断方式处理接收数据。

STM32HAL库UART串口读写功能笔记

STM32HAL库UART串口读写功能笔记

STM32HAL库UART串⼝读写功能笔记串⼝发送功能:uint8_t TxData[10]= "01234abcde";HAL_UART_Transmit(&huart2,TxData,10,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最⼤值0xffff串⼝接收功能1:uint8_t value='F';HAL_UART_Receive(&huart2,(uint8_t *)&value,1,1000);//在这个语句停留1000ms内等待接收1个字节数据,把数据存放在value中串⼝接收功能2:HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1);//程序不会在这个语句停留,直接会按照中断⽅式把接收数据存放在value中,但是这个语句只能使能⼀次串⼝中断。

所以要在中断服务函数或者回调函数中重新使能串⼝接收功能3:if(HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1) != HAL_OK){ //这⼀句写在main函数的while(1)上⾯。

⽤于启动程序启动⼀次中断接收HAL_UART_Transmit(&huart2, (uint8_t *)&"ERROR\r\n",7,10);while(1);}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){HAL_UART_Transmit(&huart2, (uint8_t *)&"\r\ninto HAL_UART_RxCpltCallback\r\n",32,0xffff); //验证进⼊这个函数了HAL_UART_Transmit(&huart2,(uint8_t *)&value,1,0xffff); //把接收到的数据通过串⼝发送出去HAL_UART_Receive_IT(&huart2,(uint8_t *)&value,1); //重新打开串⼝中断}串⼝DMA发送DMA的TX要这样设置uint8_t txData[] = {"HelloWorld\r\n"};HAL_UART_Transmit_DMA(&huart2,txData,sizeof(txData));//可以通过DMA把数据发出去DMA接收if(HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1) != HAL_OK)//main函数while(1)前,启动⼀次DMA接收{Error_Handler();}串⼝回调函数:void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){uint8_t temp[] = {"\r\nin Callback\r\n"};HAL_UART_Transmit_DMA(&huart2,temp,sizeof(temp)-1);//可以通过DMA把数据发出去HAL_UART_Receive_DMA(&huart2, (uint8_t *)rxData, sizeof(rxData)-1); //重新使能接收}main函数while(1)中不断输出rxData值HAL_UART_Transmit_DMA(&huart2,rxData,sizeof(rxData)-1);//可以通过DMA把数据发出去写在前⾯ 最近需要使⽤⼀款STM32L4系列的芯⽚进⾏开发,需要学习使⽤HAL库。

迪文串口屏开发例程

迪文串口屏开发例程

迪文串口屏开发例程
迪文串口屏开发例程是一种用于编写串口操作程序的工具。

串口
屏开发例程的核心功能是实现与串口屏之间的数据通信。

它通过定义
若干指令和函数来辅助开发者实现与各种类型的串口屏的通信,大大
减少了程序代码的编写量。

迪文串口屏开发例程是基于STM32F10xC8系列单片机的,支持中
文汉字显示,可显示32×16行,能够实现定时器、计步数等功能。

此外,这款串口屏还支持光电传感器,可以实现与外部设备的手势识别,以及实现图形、文字、图像等的显示和控制。

迪文串口屏开发例程使用时可以方便设置系统参数,实现与串口
屏的通信设备的高效交互。

另外,它还提供了完整的串口屏编程环境,可以根据需要将用户自定义的程序烧录到开发板上,以便进行测试和
使用。

总之,迪文串口屏开发例程是一款功能强大、实用性高的开发工具,可以有效地帮助用户实现与串口屏之间的数据通信,并实现特定
功能。

EFM32系列32位MCU的GPIO配置,读取-写入,外设功能

EFM32系列32位MCU的GPIO配置,读取-写入,外设功能

EFM32 系列32 位MCU 的GPIO 配置,读取/写入,
外设功能
本文主要针对Silicon Labs(亦称芯科科技)EFM32 系列32 位MCU 的GPIO 配置,读取/写入,外设功能,外部中断功能以及GPIO 引脚作为外设
反射系统(PRS)等功能进行概要描述。

与此相关的功能演示可以在Silicon Labs 推出的EFM32 入门套件主板上实现。

与通用型MCU 应用类似,EFM32 系列每个端口最多容纳16 个引脚,命名规则为Pxn,其中x 表示端口(A,B,C ...),n 表示引脚编号(0,1,...,15),其中每个端口都有独立的寄存器控制单元,用于功能的配置和数据读写等。

GPIO 配置输出端,通过写入DOUT 寄存器中的相应位来驱动引脚,其输出可以配置为线或,开漏或者具有特定驱动属性的推挽式输出。

输入配置,
其输入的引脚状态反映在其对应的DIN 寄存器中,可为每个输入引脚启用可
编程的上拉或下拉功能,另外还有滤波器功能可选,可以抑制长达50 ns 的毛刺。

在实际的应用设计中,为避免意外影响GPIO 的配置,可以按引脚锁
定其GPIO 配置。

另外,针对部分外设线路有上、下拉电阻的配置需求,这
就需要与MCU GPIO 上、下拉功能的协调使用。

EFM32 系列的三个典型寄存器配置:GPIO_Px_MODEL(端口引脚0-7)或GPIO_Px_MODEH(端口引脚8-15),GPIO_Px_DOUT 和。

牛人的STM32学习笔记(寄存器版本)..

牛人的STM32学习笔记(寄存器版本)..

一、GPIO口的配置STM32的DGPIO口最多可以有7组(GPIOa~GPIOg),而每一组GPIO口均有16个双向IO组成。

并且没个IO口均可配置成8种模式(4种输入模式,4种输出模式)。

不管配置哪个IO口也不论将其配置成哪种模式(但是配置成哪种模式要看具体应用,参考《中文参考手册》第105页)都可以按以下步骤来进行配置:(1)使能PORTx(x=A~G)时钟这里就得操作寄存器RCC_APB2ENR(32为寄存器)了15 14 13 12 11 10 9 8 ADC3EN USART1EN TIM8EN SPI1EN TIM1EN ADC2EN ADC1EN IOPGEN7 6 5 4 3 2 1 0 IOPFEN IOPEEN IOPDEN IOPCEN IOPBEN IOPAEN 保留AFIOENRCC_APB2ENR的0~15位(06~32位保留)第2~8分别是使能GPIOA~GPIOG时钟的,只要将其置“1”即可,如RCC_APB2ENR|=1<<2;就是使能GPIOA的时钟;其余IO口的始终使能一次类推。

(2)对相应的IO模式进行配置,低8位配置GPIOx_CRL;高8位配置GPIOx_CRH31 30 29 28 27 26 25 24CNF7[1:0] MODE7[1:0] CNF6[1:0] MODE6[1:0]23 22 21 20 19 18 17 16CNF5[1:0] MODE5[1:0] CNF4[1:0] MODE4[1:0]15 14 13 12 11 10 9 8CNF3[1:0] MODE3[1:0] CNF2[1:0] MODE2[1:0]7 6 5 4 3 2 1 0CNF1[1:0] MODE1[1:0] CNF0[1:0] MODE0[1:0]GPIOx_CRL(x=A~G(端口配置低寄存器x=A…E)该寄存器用于配置GPIOx的低8位,具体8种模式的配置见《中文参考手册》例如:GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300;/PD.2推挽输出;其余IO口的低8位以此类推。

STM32的IO端口高8位或低8位单独操作方法

STM32的IO端口高8位或低8位单独操作方法
位操作,都是在置1的时候对某位有影响.
举例说下怎幺对IO端口赋值:
1.对高8位/低8位/全部清零
很明显,这个只需要操作BRR寄存器即可:
对高8位清零:GPIOA->BRR=0xFF00
对低8位清零:GPIOA->BRR=0x00FF
全部清零:GPIOA->BRR=0xFFFF或GPIOA->ODR=0x0000
1,置0的位不影响原来的值
高16位应该置为0000000010101010,这个就等于~0x55(即取反)的结
果,置1使某位为ห้องสมุดไป่ตู้,置0不影响原来的值
这样,BSRR寄存器的值就是00000000101010100000000001010101,
两部分的高8位均为0,所以不会影响到IO口的高8位
总结,以下的宏实现对某端口的低8位置数,不影响高8位:
STM32的IO端口高8位或低8位单独操作方法
几天前刚接触stm32的时候,被单独操作IO口给弄糊涂了,现记录下,现
在发现其实蛮简单的,只是刚开始的时候~~~
stm32的IO端口都是16位的,如果要单独操作某高8位或低8位,则不
是那幺简单,先看两张BSRR/BRR寄存器的图:
据官方数据手册上面说,这两个寄存器用于专门对ODR进行原子操作的
#defineGPIO_WriteLow(GPIOx,a)GPIOx-
>BSRR=(((uint32_t)(uint8_t)~(a))BSRR=(((uint8_t)(uint8_t)~(a))BSRR=value的
形式,所以担心是多余的
当然了,使用下面2,3的两个宏也可以完全该清零操作~stm32固件库是不
是应该加上这两个宏/函数?

stm32位操作详解

stm32位操作详解

stm32位操作详解stm32位操作详解STM32位操作原理思想:把⼀个⽐特分成32位,每位都分配⼀个地址,这样就有32个地址,通过地址直接访问。

位操作基础位运算位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由⼆进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。

位运算&(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。

其中,按位取反运算符是单⽬运算符,其余均为双⽬运算符。

位运算符的优先级从⾼到低,依次为~、&、^、|,其中~的结合⽅向⾃右⾄左,且优先级⾼于算术运算符,其余运算符的结合⽅向都是⾃左⾄右,且优先级低于关系运算符。

(1)按位与运算符(&)按位与运算将两个运算分量的对应位按位遵照以下规则进⾏计算:0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。

即同为1的位,结果为1,否则结果为0。

例如,设3的内部表⽰为000000115的内部表⽰为00000101则3&5的结果为00000001按位与运算有两种典型⽤法,⼀是取⼀个位串信息的某⼏位,如以下代码截取x的最低7位:x & 0177。

⼆是让某变量保留某⼏位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。

以上⽤法都先要设计好⼀个常数,该常数只有需要的位是 (2)按位或运算符(|)按位或运算将两个运算分量的对应位按位遵照以下规则进⾏计算:0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1即只要有1个是1的位,结果为1,否则为0。

例如,023 | 035结果为037。

按位或运算的典型⽤法是将⼀个位串信息的某⼏位置成1。

如将要获得最右4为1,其他位与变量j的其他位相同,可⽤逻辑或运算017|j。

若要把这结果赋给变量j,可写成:j = 017|j(3)按位异或运算符(^)按位异或运算将两个运算分量的对应位按位遵照以下规则进⾏计算:0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0即相应位的值相同的,结果为0,不相同的结果为1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32串口读写迪文屏8位、16位、32位数据(应用层实
现)
文章目录
•前言
•一、串口需要的相关实现

o
▪数据类型
▪需要自定义实现的变量和函数
•二、迪文屏读写

o 2.1 向迪文屏写数据
o 2.2 从迪文屏读取数据
前言
基于STM32F407实现与迪文串口屏T5L系列的串口通信,实现8位,16位,32位的数据读写。

PS:不包含完整程序,这里只说一下核心的代码。

一、串口需要的相关实现
数据类型
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
//32位int与8位char互转
typedef union
{
u32 intdata;
u8 chardata[4];
}int_char_unioin;
//16位short与8位char互转
typedef union
{
u16 shortdata;
u8 chardata[2];
}short_char_unioin;
需要自定义实现的变量和函数
1.buffer——串口收发缓冲区数组。

2.send_buffer()——向串口发送buffer数组。

3.delay_time——等待迪文屏返回数据的时间,例:5ms,迪文屏上OS的周期是20ms,读写过快可能出问题。

(可能有更好的方法,一般情况下几ms还是可以容忍的。


4.clear_usart()——清空串口缓冲区数组buffer,如用memset()将数组置零即可。

二、迪文屏读写
STM32与迪文屏的通信核心在于向迪文屏中定义的变量进行读写,迪文屏中的变量用一个16位数据表示其地址。

迪文屏的用户可操作地址空间为0x1000-0xFFFF,我们要做的就是在这个区间内的一个地址上读写数据,这个地址指向的数据类型由DGUS II(迪文屏开发上位机软件)设置,详细内容可以查看迪文公司的应用开发指南。

2.1 向迪文屏写数据
向迪文屏上的16位地址写8位,16位,32位数据。

/************************************************************** **********************
* @name:write_to_dwin
* @brief:串口4向迪文屏写数据
* @param: addr_h 变量地址高字节
addr_l 变量地址低字节
value_h 变量值高字节
value_l 变量值低字节
* @retval:
*************************************************************** *********************/
void write_to_dwin(u8 addr_h, u8 addr_l, u8 value_h, u8 value_l)
{
u8 write_cmd[8] = {0x5A, 0xA5, 0x05, 0x82, addr_h, addr_l, value_h, value_l};
send_buffer(write_cmd, sizeof(write_cmd));
}
void writeu8_to_dwin(u16 addr, u8 data)
{
short_char_unioin m;
m.shortdata = addr;
write_to_dwin(m.chardata[1], m.chardata[0], 0x00, data);
}
void writeu16_to_dwin(u16 addr, u16 data)
{
short_char_unioin m;
m.shortdata = addr;
short_char_unioin n;
n.shortdata = data;
write_to_dwin(m.chardata[1], m.chardata[0], n.chardata[1], n.chardata[0]);
}
void writeu32_to_dwin(u16 addr, u32 data)
{
short_char_unioin m;
m.shortdata = addr;
int_char_unioin n;
n.intdata = data;
u8 write_cmd[10] = {0x5A, 0xA5, 0x07, 0x82, m.chardata[1], m.chardata[0], n.chardata[3], n.chardata[2], n.chardata[1], n.chardata[0]};
send_buffer(write_cmd, sizeof(write_cmd));
}
2.2 从迪文屏读取数据
从迪文屏上的16位地址上读取8位,16位,32位数据。

/************************************************************** **********************
* @name:read_from_dwin
* @brief:串口4从迪文屏读数据
* @param: addr_h 变量地址高字节
addr_l 变量地址低字节
size 数据大小(单位:字/两字节/16位)
* @retval:
***************************************************************
*********************/
void read_from_dwin(u8 addr_h, u8 addr_l, u8 size)
{
clear_usart();
u8 read_cmd[7] = {0x5A, 0xA5, 0x04, 0x83, addr_h, addr_l, size};
send_buffer(read_cmd, sizeof(read_cmd));
}
u8 readu8_from_dwin(u16 addr)
{
u8 data = 0;
short_char_unioin m;
m.shortdata = addr;
read_from_dwin(m.chardata[1], m.chardata[0], 0x01);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查
{
data = buffer[8];
}
}
clear_usart();
return data;
}
u16 readu16_from_dwin(u16 addr)
{
u16 data = 0;
short_char_unioin m;
short_char_unioin n;
m.shortdata = addr;
read_from_dwin(m.chardata[1], m.chardata[0], 0x01);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查
{
n.chardata[1] = buffer[7];
n.chardata[0] = buffer[8];
data = n.shortdata;
}
}
clear_usart();
return data;
}
u32 readu32_from_dwin(u16 addr)
{
u32 data = 0;
short_char_unioin m;
m.shortdata = addr;
int_char_unioin n;
read_from_dwin(m.chardata[1], m.chardata[0], 0x02);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == [1] && buffer[5] == m.chardata[0]) //地址检查{
n.chardata[3] = buffer[7];
n.chardata[2] = buffer[8];
n.chardata[1] = buffer[9];
n.chardata[0] = buffer[10];
data = n.intdata;
}
}
clear_usart();
return data;
}。

相关文档
最新文档