STM32F10x 使用SysTick的延时函数

发布者:心怀感恩最新更新时间:2016-10-08 来源: eefocus关键字:STM32F10x  SysTick  延时函数 手机看文章 扫描二维码
随时随地手机看文章
整个工程下载:
 
 
关键代码:
UART.h:
/******** 串口收发 环形缓冲区实现 ********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: ATmega128
* 文件名.......: UART.h
* 编译器.......: IAR for AVR V5.5
* 创建时间.....: 2010.10.15
* 最后修改.....: 2010.10.15
*****************************************/
#ifndef __UART_H__
#define __UART_H__

#include
#include "../main.h"    /* F_CPU */

#define UART_BAUD                9600         //波特率

#define UART_TXBUF_LENGTH        500
#define UART_RXBUF_LENGTH        500

#if UART_TXBUF_LENGTH <= 0xff
#define UART_TXBUF_HEAD_TAIL_TYPE  unsigned char
#else
#define UART_TXBUF_HEAD_TAIL_TYPE  unsigned int
#endif /* UART_TXBUF_LENGTH */

#if UART_RXBUF_LENGTH <= 0xff
#define UART_RXBUF_HEAD_TAIL_TYPE  unsigned char
#else
#define UART_RXBUF_HEAD_TAIL_TYPE  unsigned int
#endif /* UART_TXBUF_LENGTH */

typedef struct
{
    unsigned char data[UART_TXBUF_LENGTH];
    UART_TXBUF_HEAD_TAIL_TYPE head;
    UART_TXBUF_HEAD_TAIL_TYPE tail;
    UART_TXBUF_HEAD_TAIL_TYPE number;
}UART_TXBUF;

typedef struct
{
    unsigned char data[UART_RXBUF_LENGTH];
    UART_RXBUF_HEAD_TAIL_TYPE head;
    UART_RXBUF_HEAD_TAIL_TYPE tail;
    UART_RXBUF_HEAD_TAIL_TYPE number;
}UART_RXBUF;

extern volatile UART_TXBUF My_UART_TxBuf;
extern volatile UART_RXBUF My_UART_RxBuf;
extern void UART_Init(void);
extern void UART_TxByte(unsigned char _data);


#endif /* __UART_H__ */
 
 
UART.c:
/******** 串口收发 环形缓冲区实现 ********
* 版本.........: 1.0
* 作者.........: 陈利栋
* 目标.........: ATmega128
* 文件名.......: UART.c
* 编译器.......: IAR for AVR V5.5
* 创建时间.....: 2010.10.15
* 最后修改.....: 2010.10.15
*****************************************/
#include "UART.h"

volatile UART_TXBUF My_UART_TxBuf;
volatile UART_RXBUF My_UART_RxBuf;

void UART_Init(void)
{
    UBRR0L = (F_CPU / 16L / UART_BAUD - 1);
    UCSR0B_RXEN0 = 1;         // 接收使能
    UCSR0B_TXEN0 = 1;         // 发送使能
    UCSR0B_RXCIE0 = 1;        // 接收结束中断使能
    UCSR0B_TXCIE0 = 1;        // 发送结束中断使能

    // 缓冲区初始化
    My_UART_TxBuf.head = 0;
    My_UART_TxBuf.tail = 0;
    My_UART_TxBuf.number = 0;
    My_UART_RxBuf.head = 0;
    My_UART_RxBuf.tail = 0;
    My_UART_RxBuf.number = 0;

    __enable_interrupt();     // 使能总中断
}

void UART_TxByte(unsigned char _data)
{
    if (UCSR0A_UDRE0 == 1 && My_UART_TxBuf.number == 0)      // 数据寄存器空 且 缓冲区没有数据
    {
        UDR0 = _data;                                        // 直接发送
    }
    else
    {
        if (My_UART_TxBuf.number < (UART_TXBUF_LENGTH - 1))  // 发送缓冲区未满
        {
            My_UART_TxBuf.number++;
            My_UART_TxBuf.data[My_UART_TxBuf.tail] = _data;
            My_UART_TxBuf.tail++;
            if (My_UART_TxBuf.tail == UART_TXBUF_LENGTH)     
            {
                My_UART_TxBuf.tail = 0;
            }
        }
        else                                                 // 发送缓冲区已满
        {
            // 发送缓冲区溢出
        }
    }
}

#pragma vector = USART0_TXC_vect
__interrupt void USART0_TXC(void)
{
    if (UCSR0A_UDRE0 == 1 && My_UART_TxBuf.number > 0)       // 数据寄存器空 且 缓冲区有数据
    {
        UDR0 = My_UART_TxBuf.data[My_UART_TxBuf.head];
        My_UART_TxBuf.number--;
        My_UART_TxBuf.head++;
        if (My_UART_TxBuf.head == UART_TXBUF_LENGTH)
        {
            My_UART_TxBuf.head = 0;
        }
    }
}

#pragma vector = USART0_RXC_vect
__interrupt void USART0_RXC(void)
{
    static unsigned char temp = 0;
    temp = UDR0;
    if (My_UART_RxBuf.number < (UART_RXBUF_LENGTH - 1))      // 接收缓冲区未满
    {
        My_UART_RxBuf.data[My_UART_RxBuf.tail] = temp;
        My_UART_RxBuf.number++;
        My_UART_RxBuf.tail++;
        if (My_UART_RxBuf.tail == UART_RXBUF_LENGTH)
        {
            My_UART_RxBuf.tail = 0;
        }
    }
    else
    {
        // 接收缓冲区溢出
    }
}

关键字:STM32F10x  SysTick  延时函数 引用地址:STM32F10x 使用SysTick的延时函数

上一篇:STM32 arm汇编(thumb-2指令集)启动代码分析
下一篇:STM32 BIT_BAND 位段位带别名区使用入门

推荐阅读最新更新时间:2024-03-16 15:14

STM32用SysTick来做定时器
1 硬件电路配置 这里还是借用前面LED电路我就不贴图片。 2 时钟说明 SysTick和HCK的时钟频率是一样的库函数代码如下 /** * @brief Initialize and start the SysTick counter and its interrupt. * * @param ticks number of ticks between two interrupts * @return 1 = failed, 0 = successful * * Initialise the system tick timer and its interrupt and start the
[单片机]
STM32F10x _硬件I2C读写EEPROM(标准外设库版本)
本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。 实例实验效果: 1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来 2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来 实验说明: 1.多字节读写 实验为什么是从66地址写? 为什么是写入129字节? 答案:验证对EEPROM多字节“非标准地址、长度”读写的准确性。 我是使用AT24C128芯片,页大小是64字节,我从66地址,就是验证非标准地址(如:0、64、128等)开始读写; 写入长度129字节也是验证非标准长度(如:64、128、256等)的读写。 2.单字节读写
[单片机]
<font color='red'>STM32F10x</font> _硬件I2C读写EEPROM(标准外设库版本)
STM32--SYSTICK超简易定时器
上次的 定时器搞得我比较晕,勉强调通了程序,就实用主义来说应该算是勉强合格了。 当然CORTEX-M3独有的定时功能可是超级简单的 那就是SySTick,所谓的系统定时器.配置方式简单 简单的不能再简单,因为STM32 的库函数已经帮我们搞好了,只需要调用一个函数,就可以配 置系统时钟的频率和开启系统时钟的中断.呵呵....不过这么好用的定时器只有一个。 //SYSTICK 分频--1ms的系统时钟中断 if (SysTick_Config(SystemFrequency / 1000)) { /* Capture error */ while (1); } 就是这么简单,系统就会产生一个1MS 的系统时钟中断(如果除数是50
[单片机]
STM32--<font color='red'>SYSTICK</font>超简易定时器
stm32专题九:SysTick(一)系统嘀嗒定时器原理
SysTick是存在于stm32内核的定时器,嵌套在NVIC中,24位,只能递减。在stm32中文参考手册中,对于SysTick的描述其实很少,主要如下。systick的时钟可以为AHB时钟,或者是AHB时钟8分频=9M。而校准值固定为9000,也就是说,当时钟频率为9M时,9000的固定值对应1ms时间基准,9000 000对应1s时间。 在core-CM3编程手册中,有配置systick的寄存器描述。 SysTick控制和状态寄存器STK_CTRL 位描述: COUNTFLAG:如果上一次计数到0,则返回1,为计数标志。 CLKSOURCE:选择时钟源,为0时即为AHB时钟8分频,为1时直接就等于AHB总
[单片机]
stm32专题九:<font color='red'>SysTick</font>(一)系统嘀嗒定时器原理
神舟IV学习笔记(四)系统滴答SysTick两种实现方式
其实系统滴答就是一个24位的倒计时定时器,而且能够自动装置。仪器8位单片机如AVR/51要跑操作系统,需要专门占用一个定时器,但是由于优先级的原因很容易被其他程序打乱。而STM32以Cortex M3为内核,它专门开辟了一个硬件定时器,具有很高的优先级,即使在系统处于睡眠状态也能工作。我们使用系统滴答点亮LED灯的方法有两种: 第一种方法:就是将系统滴答作为普通的定时器,采用查询的方法。首先使用ysTick- LOAD装置初值,即要倒计的值。然后时钟SysTick- CTRL控制寄存器使能计数器工作在连拍模式,也就是计数减到0的时候,会出现一个标志位:COUNTFLAG,然后在使用while不断地查询这一位。按照这种编程方法封装的
[单片机]
Systick 延时函数详解
void delay_init(u8 SYSCLK) { SysTick- CTRL&=0xfffffffb; fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } Systick主要的作用就是拿来计时,其原理和应用简述一下就是这样的:通过配置寄存器SysTick- CTRL来设定Systick的计时频率并Enable使Systick开始计数,这里的SysTick- CTRL&=0xfffffffb应该很好理解,把第2位设定为0,查找应用手册可以知道这是把Systick的计时频率设定为CPU主频(SYSCLK)的1/8。 假定我们板子默认的晶振频率是8Mhz,默认CPU工作频率(SYS
[单片机]
STM32 SysTick 精准延时 简单分析
在设计软件的时候,有的对时序要求比较严格,但是简单的延时函数又不能准确延时---STM32中有一个系统滴答时钟是不错的配置--- ----第一部分是---向滴答时钟寄存器写初值,也就是要根据系统频率来递减----然后为0 则产生中断 void SysTick_Init(uint32_t a) //a-us { /* SystemFrequency / 1000 1ms中断一次 * SystemFrequency / 100000 10us中断一次 * SystemFrequency / 1000000 1us中断一次 */ // if (SysTick_Config(SystemCoreClock / 100
[单片机]
C51的延时函数
#ifndef _DELAY_51_H_ #define _DELAY_51_H_ #include AT89x52.h #define uint unsigned int #define uchar unsigned char //nus延时 void delay_nus( uchar n ); //nms延时 void delay_nms( uchar n ); //2us延时 void delay_2us( uchar t ); //50us延时 void delay_50us(uint t); //50ms延时 void delay_50ms( uint t ); #endif // DELAY_51_H /
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved