历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | STM8 入门学习与实验(一)GPIO与UART

2020-02-03 来源:eefocus

简介:这一章节将描述如何配置GPIO,以及如何配置UART


STM8工程模版:http://download.csdn.net/detail/u012388993/9904051

这两则实验将使用到的基本的系统配置初始化函数


  CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);//配置UART1时钟


  CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);配置时钟分频为1,则系统时钟频率为16Mhz/1 = 16Mhz


  CLK_HSICmd(ENABLE);//使能内部振荡器


实验一、点亮LED灯,灯正极接电源负极连接到引脚以减少驱动电流需求


代码组成


函数1.初始化GPIO并设定为输出、高频率、推挽


函数2.开GPIO输出,这里会熄灭LED灯


void ledInitAndOn(void)//demo

{

GPIO_Init(LED1PORT, LED1PIN, GPIO_MODE_OUT_OD_HIZ_FAST);

GPIO_WriteLow(LED1PORT, LED1PIN);

}

 

void ledOff(void)//demo

{

GPIO_WriteHigh(LED1PORT, LED1PIN);

}


关于GPIO的配置:


设置为OUTPUT


具有四个可选项,例如我需要配置低速开关、上拉、默认高电平输出模式部分的选择为如下所示


GPIO_MODE_OUT_PP_HIGH_SLOW


如果是高速开关、推挽、默认低电平输出则


GPIO_MODE_OUT_PP_LOW_FAST


开漏高阻态输出


GPIO_MODE_OUT_OD_HIZ_SLOW


STM8的GPIO模式配置语句就是一种混合的组合,实际使用非常方便简约


如果要解除初始化使用


GPIO_DeInit  


例如GPIO_DeInit(GPIOA);


实验二、配置UART1,输出语句到上位机


我所使用的S103F3P的引脚RX和TX分别为PD5和PD6,这里使用一个CH340  USB转串口的工具来收发数据


初始化函数


void UART_Init(void)

{

  GPIO_Init(GPIOD, GPIO_PIN_7, GPIO_MODE_OUT_OD_LOW_FAST);

GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);

UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

   UART1_Cmd(ENABLE);

}

以上函数的说明:

已知PIN6是RX,PIN7是TX,因此配置GPIO中引脚RX为输入、上拉,不配置中断,TX为高速开关、开漏输出


初始化配置串口为115200,8字,停止位1,无校验,禁用同步模式时钟,启用TXRX模式,最后一个可以只启用TX也可以只启用RX,如果只启用RX的时候发送数据将进入错误处理无法仅需执行。


最后配置完成后,使能UART1。


应用类函数:


函数1.重新命名包装发送一个字节的函数,用以方便移植


函数2.发送一段字符串


void UART_oneByte(u8 data)

{

UART1_SendData8(data);

}

void UART_sendStr(u8 *str)

{

int i;

for(i=0;i {

  while(UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);

  UART_oneByte(str[i]);

delay(1);

}

 

return;

}


实验结果:

两个实验综合起来的参考代码:


main.c


/* MAIN.C file

 * 

 * Copyright (c) 2002-2005 STMicroelectronics

 */

 

#include "stm8s.h"

#include "string.h"

#define LED1PIN     GPIO_PIN_7

#define LED1PORT    GPIOC

 

#ifdef USE_FULL_ASSERT

void assert_failed(u8* file, u32 line)

{

  while (1)

   {

   }

}

#endif

 

void delay(int ms)

{

int i,j,k;

for(k=0;k for(i=0;i<100;i++)

  for(j=0;j<20;j++)

{

}

}

void UART_Init(void)

{

  GPIO_Init(GPIOD, GPIO_PIN_7, GPIO_MODE_OUT_OD_LOW_FAST);

GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);

UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);

   UART1_Cmd(ENABLE);

}

void UART_oneByte(u8 data)

{

UART1_SendData8(data);

}

void UART_sendStr(u8 *str)

{

int i;

for(i=0;i {

  while(UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);

  UART_oneByte(str[i]);

delay(1);

}

 

return;

}

 

void sysConfigure(void)

{

CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1, ENABLE);

  CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);

  CLK_HSICmd(ENABLE);

}

 

void ledInitAndOn(void)//demo

{

GPIO_Init(LED1PORT, LED1PIN, GPIO_MODE_OUT_OD_HIZ_FAST);

GPIO_WriteLow(LED1PORT, LED1PIN);

}

 

void ledOff(void)//demo

{

GPIO_WriteHigh(LED1PORT, LED1PIN);

}

main()

{

sysConfigure();

UART_Init();

while (1)

{

ledInitAndOn();

delay(500);

ledOff();

delay(500);

UART_sendStr("yo,hello,stm32");

}

}

推荐阅读

史海拾趣

EOS POWER INDIA Pvt公司的发展小趣事

在稳固了印度市场后,EOS开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户和合作伙伴建立了广泛的联系。通过与国际知名企业的合作与交流,EOS不断吸收先进的管理经验和技术理念,并将其应用到自己的产品和服务中。这些举措不仅提升了EOS的国际知名度,还为公司带来了更多的商业机会。

BAE Systems公司的发展小趣事

BAE Systems公司一直致力于技术创新,不断推动电子行业的发展。公司投入大量资源进行研发,开发出了一系列先进的电子系统和产品。这些技术成果不仅提升了公司的竞争力,也为全球电子行业的技术进步做出了贡献。例如,公司在军事通信、雷达系统、导弹技术等领域都取得了重要的突破,为国家的安全和防御提供了强有力的支持。

Fascomp公司的发展小趣事

为了进一步提升技术实力和市场竞争力,Fascomp积极寻求与国际知名企业的技术合作。通过与多家跨国公司的联合研发项目,Fascomp成功吸收和借鉴了国际先进的技术和管理经验。此外,公司还积极拓展海外市场,产品远销欧美、亚洲等多个国家和地区,进一步提升了公司的国际化水平。

福建国光公司的发展小趣事

随着公司规模的扩大,Fascomp开始关注更广阔的市场。公司针对智能手机市场推出了一款低功耗、高性能的处理器,迅速在市场上获得了成功。同时,公司还不断推出新的产品线,如平板电脑专用芯片、物联网设备等,以满足不同客户的需求。这些创新举措使Fascomp在激烈的市场竞争中脱颖而出。

Goldentech Discrete Semiconductor Inc公司的发展小趣事

进入21世纪后,随着全球电子市场的竞争加剧,Goldentech意识到单靠技术创新已不足以维持其市场地位。因此,公司开始积极寻求与行业领先企业的战略合作。通过与一家知名芯片设计公司的深度合作,Goldentech成功将其高性能离散半导体器件集成到对方的芯片设计中,从而实现了产品的广泛应用。这一合作不仅扩大了Goldentech的市场份额,还提升了其品牌知名度和行业影响力。

Big-Sun Electronics Co Ltd公司的发展小趣事

Big-Sun Electronics Co Ltd公司自成立以来,始终致力于技术研发和产品创新。在成立初期,公司便投入大量资源于研发部门,通过不断试验和改进,成功研发出了一款具有高效能、低能耗特点的电子芯片,这一技术突破迅速在市场上引起了广泛关注。随着产品线的不断扩展,Big-Sun的电子产品逐渐在行业内树立起了技术领先的形象。

问答坊 | AI 解惑

实话实说电源设计

  最近,我遇见了一个老朋友,他是一位很有经验的模拟电路工程师,从事高可靠服务器用电源子系统的设计工作。他说,他设计的宽度为 19 英寸的典型机架安装电路板要消耗 100A 的电流。我对此一点也不感到惊讶。我们都知道,今天的处理器耗电很大, ...…

查看全部问答>

求助!中英文对照论文

求助一篇关于单片机的LED点阵显示屏控制设计的,与其有关的中英文对照论文,5000字,谢谢了!!!…

查看全部问答>

关于VXWORKS任务

建立一个可以下载的工程,然后添加如下代码,就是自带的例子,关于例子程序有几点疑问, 有高手帮忙讲解下,谢谢了 1.程序入口在哪里?从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行? 还是在&nb ...…

查看全部问答>

socket数据接收处理问题C#

问题描述: 在“private void btnDiagnosticClicked(object sender, EventArgs e)”方法中 执行“RecData = MainMenu.socketHH.GetRecData();”“RecData”一直接收为空。 而在“private void ReceiveCallback(IAsyncResult ar)”方法中 “recB ...…

查看全部问答>

arm linux驱动编写中,中断服务程序中可以进行ioremap吗?

发现只要在中断服务程序中执行到ioremap函数就会报错 nable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c355c000 [00000000] *pgd=338e5031, *pte=00000000, *ppte=00000000 Internal error: Oops: 817 [#1 ...…

查看全部问答>

TLC116

  该TLC116系列可控硅采。采用优质玻璃钝化PNPN技术。 TLC116的绝对额定值为:(1)符号是IT(RMS),这个参数是有效值(360°导通状态电流传导角等于40℃)组合成的Tl型、价值3,单位是A;(2)符号是IT(RMS),这个参数是有效值(360°导通状态电流传 ...…

查看全部问答>

HDL 实践

经过我仔细测试,发现如下问题;   ALTERA 的Quartus 9.0 以及以下版本不支持SYSTEM C; 但Quartus 9.1 支持SYSTEM C 语法。学习HDL的几点重要提示: 1.了解HDL的可综合性问题:HDL有两种用途:系统仿真和硬件实现。 如果程序只用于仿真,那么 ...…

查看全部问答>

关于应用MSP430F449设计一个电流表的量程问题

我们在利用F449进行设计一个电流表,在对固定电阻取电压时考虑以下几个问题: 1.F449的供电电压是9v(我是说那个变压器),那么对于单片机进行AD转换时的驱动电压是多少?也就是我所能得到的电压的范围是多少?? 2.F449在进行AD转换过程中,所 ...…

查看全部问答>

求助

#ifndef    MSP430XF449_H #include <msp430x44x.h> #endif 请问这几句话是什么意思,常见的不是 #ifndef   **** #define  **** #endif 吗?…

查看全部问答>

51单片机

我用lcd1602和ds1302写一个时钟程序,想用红外遥控调时,想让它闪烁,不过检测到红外信号后不闪烁。有哪位高手遇到同样的问题,分享一下解决方案,不胜感激!…

查看全部问答>