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