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

来源:互联网 发布:淘宝规蜜投诉 编辑:程序博客网 时间:2024/06/06 12:27

简介:这一章节将描述如何配置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<strlen(str);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_ASSERTvoid assert_failed(u8* file, u32 line){  while (1)   {   }}#endifvoid delay(int ms){int i,j,k;for(k=0;k<ms;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<strlen(str);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");}}



原创粉丝点击