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

简介:这一章节将描述如何配置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_ASSERT
void assert_failed(u8* file, u32 line)
{
  while (1)
   {
   }
}
#endif

void 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");
	}
}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值