串口是单片机最重要的外设之一,在很多项目开发中都有应用,Lora模块的外部通讯方式就是串口。
本节简单的和大家解析一下串口通讯及驱动代码的编程。
STM8L101F3单片机支持一路串口通讯。我们先看一下Lora模块的硬件接口,如下图所示:
串口的硬件接口是PC2 和PC3两个脚位。
下面开始讲解软件部分,这块我们无际单片机编程也有这个项目全部视频教程,下面是文字版。
软件驱动
STM8打开标准库文件夹,打开串口USART例程:
2.如上图所示,是标准库中串口通讯的的例程,并选择第一个例程。
3.我们按照之前的方式,把USART_HyperTerminalInterrupt文件复制到ProjectSTM8L10x_StdPeriph_Templates 中,如下图。
4.进入ProjectSTM8L10x_StdPeriph_TemplatesEWSTM8,打开工程
5.我们简单的看一下串口的初始化代码
static void USART_Config(void)
{
/*High speed internal clock prescaler: 1*/
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);
/*Set the USART RX and USART TX at high level*/
GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);
/* Enable USART clock */
CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);
USART_DeInit();
/* USART configuration ------------------------------------------------------*/
/* USART configured as follow:
- BaudRate = 9600 baud
- Word Length = 8 Bits
- One Stop Bit
- Odd parity
- Receive and transmit enabled
*/
USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,
USART_Parity_Odd, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));
/* Enable the USART Transmit interrupt: this interrupt is generated when the
USART transmit data register is empty */
USART_ITConfig(USART_IT_TXE, ENABLE);
/* Enable the USART Receive interrupt: this interrupt is generated when the
USART receive data register is not empty */
USART_ITConfig(USART_IT_RXNE, ENABLE);
/* Enable general interrupts */
enableInterrupts();
}
①第一条代码: CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);
单片机工作系统时钟配置函数,内部系统时钟16M,
CLK_MasterPrescaler_HSIDiv1表示1分频 系统工作时钟16M
其他可配置参数如下图:
typedef enum {
CLK_MasterPrescaler_HSIDiv1 = (uint8_t)0x00, /*!< High speed internal clock prescaler: 1 */
CLK_MasterPrescaler_HSIDiv2 = (uint8_t)0x01, /*!< High speed internal clock prescaler: 2 */
CLK_MasterPrescaler_HSIDiv4 = (uint8_t)0x02, /*!< High speed internal clock prescaler: 4 */
CLK_MasterPrescaler_HSIDiv8 = (uint8_t)0x03 /*!< High speed internal clock prescaler: 8 */
} CLK_MasterPrescaler_TypeDef;
②第二条代码: GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);
串口GPIO口配置。例程的端口是PC2 PC3.
STM8L101F3的串口端口是PC2 和PC3,这个地方需要修改
③第三条代码:CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);
打开串口时钟函数,初始化串口的时候,首先要打开串口时钟。
④第四条代码:USART_DeInit();
串口复位函数,复位串口相关的寄存器。
⑤第五条代码:USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,
USART_Parity_Odd, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));
串口初始化函数。我们打开串口库函数“stm8l10x_usart.c”,查看本函数的原型。
如上图所示,这个函数是串口的初始化函数,我们研究一下这个函数的相关参数。
参数1:uint32_t BaudRate, 配置串口通讯的波特率,可配置为9600,115200等
参数2:USART_WordLength_TypeDef USART_WordLength 配置通讯数据的位数。
可选参数项:
USART_WordLength_8D: 8 bits Data
USART_WordLength_9D: 9 bits Data
参数3: USART_StopBits_TypeDef USART_StopBits, 串口通讯的停止位
可选参数项:
USART_StopBits_1 :One stop bit is transmitted at the end of frame
USART_StopBits_2 :Two stop bits are transmitted at the end of frame
参数4: USART_Parity_TypeDef USART_Parity 奇偶校验位 配置
可配置的参数:
typedef enum
{
USART_Parity_No = (uint8_t)0x00, /*!< No Parity*/
USART_Parity_Even = (uint8_t)0x04, /*!< Even Parity*/
USART_Parity_Odd = (uint8_t)0x06 /*!< Odd Parity*/
} USART_Parity_TypeDef;
参数5:USART_Mode_TypeDef USART_Mode 配置串口的通讯使能。
typedef enum
{
USART_Mode_Rx = (uint8_t)0x04, /*!< 0x04 Receive Enable */
USART_Mode_Tx = (uint8_t)0x08 /*!< 0x08 Transmit Enable */
} USART_Mode_TypeDef;
⑥第六条代码:USART_ITConfig(USART_IT_TXE, ENABLE);
串口通讯数据发送中断使能函数: 用来配置是否打开串口通讯数据发送中断功能
⑦第七条代码:USART_ITConfig(USART_IT_RXNE, ENABLE);
串口通讯数据接收中断使能函数: 用来配置是否打开串口通讯数据接收中断功能
⑧第八条代码: enableInterrupts();
打开总中断功能。
6.我们简单的看一下串口的初始化代码
INTERRUPT_HANDLER(USART_TX_IRQHandler, 27) 串口发送中断函数
INTERRUPT_HANDLER(USART_RX_IRQHandler, 28) 串口接收中断函数
定时器实验测试:
1.我们先打开Lora模块的原理图如下:
2.官网的例程的初始化程序我们刚才已经已经分析过来,但我们需要对官网的例程简单的修改一下。如下:
static void USART_Config(void)
{
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);
GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_2, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);
USART_DeInit();
/* USART configuration ------------------------------------------------------*/
/* USART configured as follow:
- BaudRate = 9600 baud
- Word Length = 8 Bits
- One Stop Bit
- Odd parity
- Receive and transmit enabled
*/
USART_Init((uint32_t)9600, USART_WordLength_8D, USART_StopBits_1,
USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx));
USART_ITConfig(USART_IT_TXE, ENABLE);
USART_ITConfig(USART_IT_RXNE, ENABLE);
enableInterrupts();
}
如上图,我修改了两个地方:
①修改了初始化的端口, 因STM8L101F3的这款单片机的串口是PC2和PC3. 所以讲PC4修改成PC3;
②通讯验证的方式,之前是奇校验,修改成无校验。
我们工作中最常用的通讯方式就是无校验。所以我们以无校验来做实验测试。
3.我们在看一下无线发射和接收的中断服务函数:
①串口接收中断服务函数:
串口接收中断服务函数原代码:
#define RxBufferSize 0x20
uint8_t RxBuffer[RxBufferSize];
uint16_t RxCounter = 0;
uint8_t NbrOfDataToRead = RxBufferSize;
INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)
{
STM_EVAL_LEDInit(LED3);
/* Read one byte from the receive data register */
RxBuffer[RxCounter++] = (uint8_t) (USART_ReceiveData8() & 0x7F);
if (RxCounter == NbrOfDataToRead)
{
STM_EVAL_LEDToggle(LED3);
/* Disable the USART Receive interrupt */
USART_ITConfig(USART_IT_RXNE, DISABLE);
}
}
因原代码是奇校验接收函数,我们简单的修改一下,修改后代码如下:
INTERRUPT_HANDLER(USART_RX_IRQHandler, 28)
{
uint8_t temp;
temp = (uint8_t) USART_ReceiveData8();// & 0x7F);
USART_SendData8(temp);
}
实现的功能,就是将无线接收的数据,通过串口返回。
USART_SendData8(temp); 串口无线发送函数,原型如下:
/**
* @brief Transmits 8 bit data through the USART peripheral.
* @param Data The data to transmit.
* @retval None
*/
void USART_SendData8(uint8_t Data)
{
/* Transmit Data */
USART->DR = Data;
}
②串口发送中断服务函数:
串口数据发送终端服务原代码:
#define TxBufferSize (countof(TxBuffer) - 1)
uint8_t TxBuffer[] = "nrHyperTerminal Interrupt: USART-Hyperterminal communication using Interruptnr";
uint8_t NbrOfDataToTransfer = TxBufferSize;
uint8_t TxCounter = 0;
INTERRUPT_HANDLER(USART_TX_IRQHandler, 27)
{
STM_EVAL_LEDInit(LED2);
/* Write one byte to the transmit data register */
USART_SendData8(TxBuffer[TxCounter++]);
if (TxCounter == NbrOfDataToTransfer)
{
STM_EVAL_LEDToggle(LED2);
/* Disable the USART Transmit interrupt */
USART_ITConfig(USART_IT_TXE, DISABLE);
}
}
主要实现的功能:
1.设备上电后,串口会自动发送数据”nrHyperTerminal Interrupt: USART-Hyperterminal communication using Interruptnr”;
2.数据发送完成之后,关闭串口发送中断功能。
USART_ITConfig(USART_IT_TXE, DISABLE); 函数表示关闭串口发送中断功能。
以上的代码我们制作一个简单的修改。修改uint8_t TxBuffer[]的值,修改如下:
uint8_t TxBuffer[] = “nrLora,STM8 Usart Tx Interrupt Test nr”;
③编译并下载代码到Lora模块,并Lora模块的串口连接到电脑。连接如下图所示:
④在电脑端打开串口助手,并配置串口参数,打开串口,测试数据如下:
串口实验测试完成。
上一篇:【STM8S】 窗口看门狗
下一篇:手把手教你STM8单片机标准库移植
推荐阅读
史海拾趣
随着技术的不断进步,Analog Power公司始终保持着对技术创新的热情。他们不断研发新的电源管理技术和产品,推出了一系列具有高性能、高效率、低功耗特点的电源管理解决方案。这些创新产品不仅满足了客户的需求,也引领了市场的发展潮流,使得Analog Power在行业中逐渐崭露头角。
作为电子行业的领军企业之一,宇阳科技始终坚持以创新为驱动的发展战略。公司不断投入研发资金,加强技术团队建设,积极引进先进技术和管理经验。通过持续创新和技术升级,宇阳科技成功推出了多款具有自主知识产权的新型电子元器件产品,并引领了行业潮流。同时,公司还积极参与行业标准制定和技术交流合作等活动,为推动电子行业的发展做出了积极贡献。
以上五个故事梗概概述了宇阳科技在电子行业中的发展历程和主要成就。这些故事不仅展现了公司的技术实力和市场地位,也体现了公司不断创新、追求卓越的发展理念。
多年来,宇阳科技凭借其在MLCC领域的持续创新和卓越表现,荣获了多项荣誉。从2005年被国家商务部评为企业诚信度“双A”企业,到2008年国内首创的0201超微型MLCC开发成功并量产,再到2018年获中国电子学会科学技术奖科技进步类二等奖,宇阳科技的技术实力和市场地位得到了广泛的认可。
DSP Group Inc公司成立于1987年,早期专注于数字信号处理(DSP)技术的研发。在成立之初,公司便认识到了DSP技术在语音处理、音频编解码等领域的巨大潜力。通过不断的技术创新和研发投入,DSP Group逐渐在DSP领域树立了领先地位,为后续的发展奠定了坚实的基础。
随着技术的不断进步和市场需求的增长,DSP Group开始将业务扩展到半导体领域。公司推出了一系列高性能、低功耗的DSP芯片,广泛应用于移动通信、智能家居、汽车电子等领域。这一举措不仅进一步巩固了DSP Group在DSP领域的领先地位,还为公司带来了可观的收益和市场份额。
作为一家有远见的企业,德立电子深知绿色发展的重要性。公司积极响应国家环保政策,推行绿色生产和绿色供应链管理。同时,德立电子还积极参与社会公益事业,回馈社会,履行企业社会责任。
请注意,以上故事框架仅供参考,具体内容和细节需根据实际情况进行填充和完善。
最近两个月模拟工作面对的一些比较深思的面试题 希望能给还没有毕业的童鞋一些帮助 1, 相近的尺寸下,为什么BJT的工作工作频率比CMOS的高,噪声低。从器件的角度分析 2,ESD电路起作用的时候,放电回路的电路图和结构以及版图实现原理 3,verti ...… 查看全部问答∨ |
|
有高手可帮解决这个问题吗: PIC单片机配的晶振电路,就最常见的接法,一个4M晶振,两个20pF电容,单片机供电约4V,不工作,我由以下方法判断是不起振(不知对否):用手拿镊子接触在OSC1引脚的电容靠晶振一方的脚(或接触OSC1端的 ...… 查看全部问答∨ |
在给的开发流程中是这样: AT%IPOPEN="TCP","61.144.177.202",3000 CONNECT AT%IPSEND="683100310068c90896060000027400000100e416" %IPSEND:15 OK %IPDATA:20"683100310068C90896060000027400000100E416" ---------------- ...… 查看全部问答∨ |
没用过ST的单片机,目前有个项目需要用到STM8L,和STM8S的片子 (1)我想知道STM8L和STM8S的外设控制是否一样,比方说STM8L的串口可以直接移值到STM8S上。 (2)STM8L的48脚封装的有没有和STM32系列的直接PIN对PIN,谢谢!… 查看全部问答∨ |
|