历史上的今天
今天是: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(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"); } } 
史海拾趣
|
建立一个可以下载的工程,然后添加如下代码,就是自带的例子,关于例子程序有几点疑问, 有高手帮忙讲解下,谢谢了 1.程序入口在哪里?从progStart开始执行,在其中的return(OK)返回了,接下来执行什么?其他几个任务的代码怎么执行? 还是在&nb ...… 查看全部问答> |
|
问题描述: 在“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 ...… 查看全部问答> |
|
我们在利用F449进行设计一个电流表,在对固定电阻取电压时考虑以下几个问题: 1.F449的供电电压是9v(我是说那个变压器),那么对于单片机进行AD转换时的驱动电压是多少?也就是我所能得到的电压的范围是多少?? 2.F449在进行AD转换过程中,所 ...… 查看全部问答> |




