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;相关推荐

  1. bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...

    bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看 ...

  2. 浅谈晶振作用功能、晶体和晶振、外部时钟和内部时钟、分频倍频预分频后分频、定时器和计数器

    Fosc=frequence oscillate 晶振频率 晶振是用来起振的,只是振荡电路的一种,还有自激振荡器.电容三点式振荡器.LC振荡器.RC振荡器......其作用是通电才产生原始时钟频率,这 ...

  3. STM32使用内部时钟HSI作为系统时钟及配置Systick定时器

    参考:https://blog.csdn.net/huangyangquan/article/details/78790443 https://www.cnblogs.com/dustinzhu/p/ ...

  4. 使用 FlipClock.js 制作精美的时钟、定时器和倒计时功能

    FlipClock.js 被创建出来是因为其他的解决方案不够抽象,不能够在不重写的代码的情况下提供了深层次的自定义.有些库的参数过多,而另外一些则是脚本中的硬编码太多,不够灵活. 在参考许多现有的解决 ...

  5. 假设定时器内部时钟为16MHz,(1)完成下面的注释。(2)可以定时的时间为( 10 )ms。

    假设定时器内部时钟为16MHz,(1)完成下面的注释.(2)可以定时的时间为( 10  )ms. 公式: T=(arr+1)*(PSC+1)/Tck 其中TCK为时钟频率,PSC为时钟预分频系数,ar ...

  6. Go语言实战之数组的内部实现和基础功能

    写在前面 嗯,学习GO,所以有了这篇文章 博文内容为<GO语言实战>读书笔记之一 主要涉及数组相关知识 世上除了爹娘,再没有人是理所应当对你好的. --烽火戏诸侯<剑来> 数组 ...

  7. STM32F系列ARM Cortex-M3核微控制器基础之系统时钟一

    STM32F系列ARM Cortex-M3核微控制器基础之系统时钟 本文章是基于STM32F103ZE微控制器,主要是详细说明STM32F系列的特性,由于本人是初学者,出现错误是难免的,请大家见谅.固 ...

  8. DSP学习笔记之系统时钟、定时器、GPIO篇

    \qquad写在前面,不管是C51.MSP430.32也好,DSP也好,总要有一个掌握的比较熟练,不能每次都复制粘贴别人的代码然后修修补补吧.不要再做Ctrl +C.Ctrl+V工程师.主要参考来自于 ...

  9. 发现好文!51单片机特殊功能寄存器 /I/O口操作 /中断/ 定时器/ 串口通信/ ---位寻址解释由来--以及程序例程

    51单片机特殊功能寄存器有哪些_功能是什么 最近学习中对寄存器的概念理解很迷惑,I/O口操作/中断/定时器/串口通信四大模块的寄存器应用不太明白,这篇文章,解释的不错,希望帮到各位! 1.21个寄存器 ...

  10. 基于STC12C5A的MINI3216多功能点阵时钟

    代码地址如下: http://www.demodashi.com/demo/12862.html 基于STC12C5A的MINI3216多功能点阵时钟 硬件详解 PCB 硬件原理图 主控模块 max7 ...

最新文章

  1. matplotlib色彩填充之fill、fill_between
  2. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题
  3. 20211124 自动化学科领域高质量技期刊分级目录(控制理论与控制工程)
  4. vue lang_推荐一个基于Vue 的 H5 快速开发模板
  5. 51 SD配置-定价配置-维护定价过程
  6. Python Machine Learning Windows 安装包网址
  7. is_numeric 检测变量是否为数字或数字字符串
  8. Fatal Error LNK1123:转换到COFF期间失败:文件无效或损坏
  9. 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据
  10. python 3d绘图kmeans_使用python绘制3d的图形
  11. 【软考系统架构设计师】2013年下系统架构师案例分析历年真题
  12. 【统计学】三大相关系数之斯皮尔曼相关系数(spearman correlation coefficient)
  13. 帝国cms添加关注公众号登录
  14. TTO热转印打印机简介
  15. 中国IT公司百强排名
  16. mt6577驱动开发 笔记版 转载请注明出处---crosskernel@gmail.com
  17. web技术分享| 前端秘籍之“易容”术
  18. windows 打印机管理机制(任务后台等待机制)
  19. c语言程序 计算离高考天数,用c++程序计算一个孩子从出生到高考需要多少天
  20. R 语言中添加辅助线(ggplot2)

热门文章

  1. Python3对IP进行查询
  2. 阿里云云盾·Web应用防火墙 获“2018网络安全创新产品(技术)评选”一等奖
  3. DEFERRED_SEGMENT_CREATION
  4. Linux C语言解析并显示.bmp格式图片
  5. HashMap底层实现(源码分析)
  6. Windows XP搜索功能 包含文字 搜索不到内容的解决办法
  7. ie6对postion:fixed的完美解决方案
  8. 为Chrome添加Metro风格的快速拨号
  9. Linq 操作XML文件
  10. 专家答疑:揭开虚拟化的迷雾