×
嵌入式 > 技术百科 > 详情

STM8 入门学习与实验(一)GPIO与UART

发布时间:2022-01-26 发布时间:
|

简介:这一章节将描述如何配置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");

}

}


 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
物联传感与Atmel强强联手 达成智能家居战略合作协议