STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf;
STM8L051调试笔记之基础功能:
系统时钟、串口、定时器都是基础而且必须的功能,这里放在一起统一记录,之所以用TIM2定时器,是因为想实现STM32的滴答定时器功能
这些基础功能没什么好理解的,就直接贴代码了main.c:
main.c:
void main(void){enableInterrupts();Sysclk_Init();LED_Init();Uart1_Init();printf("This is a STM8 code!!!\r\n");while (1){if(secondClock_flag){secondClock_flag = 0;printf("This is a STM8 code!!!\r\n");}if(calculate_flag){calculate_flag = 0;printf("a minute\r\n");}} }
内部时钟及定时器:
我使用的板子上是没有外部晶振的,所以这里使用的是内部16Mhz的晶振,可以按个人需求对其进行分频。需要说明的是,STM8的程序中,即使没有配置系统时钟,板子依然可以工作,因为默认会有一个2Mhz的内部时钟,这一点在手册中可以查到:
接下来贴代码,由于本人比较懒,只保留的内部时钟的代码,对时钟要求不高的可以参考参考,要求时钟准确的还是用外部晶振吧,代码中附送延时函数,在我的上一篇笔记中有记录
sysclk.c:
#include "sysclk.h"volatile u8 fac_us=0;u8 secondClock_flag = 0; u8 calculate_flag = 0;void delay_us(u16 nus) {__asm( "PUSH A \n" "DELAY_XUS: \n" "LD A,fac_us \n" "DELAY_US_1: \n" "NOP \n" "DEC A \n" "JRNE DELAY_US_1 \n" "NOP \n" "DECW X \n" "JRNE DELAY_XUS \n" "POP A \n" ); }void delay_ms(u32 nms) {u8 t;if(nms>65){t=nms/65;while(t--)delay_us(65000);nms=nms%65;}delay_us(nms*1000); }void delay_init(u8 clk) {if(clk>16)fac_us=(16-4)/4;else if(clk>4)fac_us=(clk-4)/4; else fac_us=1; }void TIM2_Init(void) {CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);TIM2_TimeBaseInit(TIM2_Prescaler_16,TIM2_CounterMode_Up,1000); //将系统时钟16分频得到1Mhz,计数1000(或999,未细究)则得到一个每ms进一次的中断,TIM2_ARRPreloadConfig(ENABLE);TIM2_ITConfig(TIM2_IT_Update,ENABLE);TIM2_Cmd(ENABLE); }void Sysclk_Init(void) {CLK_HSICmd(ENABLE);CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); //选择HIS内部晶振,CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //STM8,HSI为16Mhz,这里1分频即不分频TIM2_Init();delay_init(16); //参数是系统时钟,这里是16Mhz所以参数为16 }
sysclk.h中内容:
中断stm8l15x_it.c中内容(找到TIM2定时器对应的INTERRUPT_HANDLER):
串口功能:
这里使用的是PA2,PA3两个脚的串口,由于STM8只有8kb的flash,使用printf函数时一不小心就内存不足了,也在网上尝试了很多解决方案,这里我尝试的比较有用的方法是在设置里将printf formatter的值改为Tiny,我这里改为small也是可以的,至于这样会产生什么影响需要再进行分析了,听说改为Tiny是不使用对浮点数的操作,会使对printf相关库函数编译的代码小很多,具体是否如此没有验证,如有错误误导他人请及时批评指正。
贴代码:
uart.c
#include "uart.h"/*** @brief Configure USART peripheral * @param None* @retval None*/ void Uart1_Init(void) {/* USART1 configured as follow:- BaudRate = 115200 baud - Word Length = 8 Bits- One Stop Bit- Odd parity- Receive and transmit enabled- USART Clock disabled*//* Enable USART clock */CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);/* USART1 Tx- Rx remapping to PA2- PA3 */SYSCFG_REMAPDeInit();SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA, ENABLE);/* Configure USART Tx pin output*/GPIO_Init(GPIOA, GPIO_Pin_2, GPIO_Mode_Out_PP_High_Fast);/* Configure USART Rx pin input*/GPIO_Init(GPIOA, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);/* RESET USART1 */USART_DeInit(USART1);/* USART configuration */USART_Init(USART1, (u32)115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, USART_Mode_Tx|USART_Mode_Rx);/* Enable the USART Receive interrupt: this interrupt is generated when the USARTreceive data register is not empty */USART_ClearITPendingBit(USART1, USART_IT_RXNE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/* Enable the USART Transmit complete interrupt: this interrupt is generated when the USARTtransmit Shift Register is empty *///USART_ITConfig(EVAL_COM1, USART_IT_TC, ENABLE);/* Enable USART */USART_Cmd(USART1, ENABLE); }/* 发送一个字节 */ void UART1_SendByte(u8 data) {USART_SendData8(USART1, data);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); }/* 发送len个字符 */ void UART1_SendStr(u8 *str) {while(*str != '\0') { UART1_SendByte(*str++);} }/* 接收一个字符 */ u8 UART1_ReceiveByte(void) {u8 UART1_RX_BUF; while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);UART1_RX_BUF = USART_ReceiveData8(USART1);return UART1_RX_BUF; }#ifdef _IAR_ int fputc(int ch, FILE *f) {UART1_SendByte(ch);return (ch); } #else PUTCHAR_PROTOTYPE {UART1_SendByte(c);return (c); } #endifGETCHAR_PROTOTYPE { #ifdef _COSMIC_char c = 0; #elseint c = 0; #endif/* Loop until the Read data register flag is SET */while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);c = USART_ReceiveData8(USART1);return (c); }
uart.h:
#ifndef __UART_H #define __UART_H/* 包含系统头文件 */ #include "stm8l15x_conf.h" #include <stdio.h> #include <stdarg.h>/* Private define ------------------------------------------------------------*/ #ifdef _RAISONANCE_ #define PUTCHAR_PROTOTYPE int putchar (char c) #define GETCHAR_PROTOTYPE int getchar (void) #elif defined (_COSMIC_) #define PUTCHAR_PROTOTYPE char putchar (char c) #define GETCHAR_PROTOTYPE char getchar (void) #else /* _IAR_ */ #define PUTCHAR_PROTOTYPE int putchar (int c) #define GETCHAR_PROTOTYPE int getchar (void) #endif /* _RAISONANCE_ */void Uart1_Init(void); void UART1_SendByte(u8 data); void UART1_SendStr(u8 *str);#ifdef _IAR_ int fputc(int ch, FILE *f); #endif#endif
stm8l15x_it.c中:
转载于:https://www.cnblogs.com/fly2199/p/7691136.html
STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf;相关推荐
- bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看 ...
- 浅谈晶振作用功能、晶体和晶振、外部时钟和内部时钟、分频倍频预分频后分频、定时器和计数器
Fosc=frequence oscillate 晶振频率 晶振是用来起振的,只是振荡电路的一种,还有自激振荡器.电容三点式振荡器.LC振荡器.RC振荡器......其作用是通电才产生原始时钟频率,这 ...
- STM32使用内部时钟HSI作为系统时钟及配置Systick定时器
参考:https://blog.csdn.net/huangyangquan/article/details/78790443 https://www.cnblogs.com/dustinzhu/p/ ...
- 使用 FlipClock.js 制作精美的时钟、定时器和倒计时功能
FlipClock.js 被创建出来是因为其他的解决方案不够抽象,不能够在不重写的代码的情况下提供了深层次的自定义.有些库的参数过多,而另外一些则是脚本中的硬编码太多,不够灵活. 在参考许多现有的解决 ...
- 假设定时器内部时钟为16MHz,(1)完成下面的注释。(2)可以定时的时间为( 10 )ms。
假设定时器内部时钟为16MHz,(1)完成下面的注释.(2)可以定时的时间为( 10 )ms. 公式: T=(arr+1)*(PSC+1)/Tck 其中TCK为时钟频率,PSC为时钟预分频系数,ar ...
- Go语言实战之数组的内部实现和基础功能
写在前面 嗯,学习GO,所以有了这篇文章 博文内容为<GO语言实战>读书笔记之一 主要涉及数组相关知识 世上除了爹娘,再没有人是理所应当对你好的. --烽火戏诸侯<剑来> 数组 ...
- STM32F系列ARM Cortex-M3核微控制器基础之系统时钟一
STM32F系列ARM Cortex-M3核微控制器基础之系统时钟 本文章是基于STM32F103ZE微控制器,主要是详细说明STM32F系列的特性,由于本人是初学者,出现错误是难免的,请大家见谅.固 ...
- DSP学习笔记之系统时钟、定时器、GPIO篇
\qquad写在前面,不管是C51.MSP430.32也好,DSP也好,总要有一个掌握的比较熟练,不能每次都复制粘贴别人的代码然后修修补补吧.不要再做Ctrl +C.Ctrl+V工程师.主要参考来自于 ...
- 发现好文!51单片机特殊功能寄存器 /I/O口操作 /中断/ 定时器/ 串口通信/ ---位寻址解释由来--以及程序例程
51单片机特殊功能寄存器有哪些_功能是什么 最近学习中对寄存器的概念理解很迷惑,I/O口操作/中断/定时器/串口通信四大模块的寄存器应用不太明白,这篇文章,解释的不错,希望帮到各位! 1.21个寄存器 ...
- 基于STC12C5A的MINI3216多功能点阵时钟
代码地址如下: http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max7 ...
最新文章
- matplotlib色彩填充之fill、fill_between
- Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题
- 20211124 自动化学科领域高质量技期刊分级目录(控制理论与控制工程)
- vue lang_推荐一个基于Vue 的 H5 快速开发模板
- 51 SD配置-定价配置-维护定价过程
- Python Machine Learning Windows 安装包网址
- is_numeric 检测变量是否为数字或数字字符串
- Fatal Error LNK1123:转换到COFF期间失败:文件无效或损坏
- 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据
- python 3d绘图kmeans_使用python绘制3d的图形
- 【软考系统架构设计师】2013年下系统架构师案例分析历年真题
- 【统计学】三大相关系数之斯皮尔曼相关系数(spearman correlation coefficient)
- 帝国cms添加关注公众号登录
- TTO热转印打印机简介
- 中国IT公司百强排名
- mt6577驱动开发 笔记版 转载请注明出处---crosskernel@gmail.com
- web技术分享| 前端秘籍之“易容”术
- windows 打印机管理机制(任务后台等待机制)
- c语言程序 计算离高考天数,用c++程序计算一个孩子从出生到高考需要多少天
- R 语言中添加辅助线(ggplot2)