OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6143|回复: 11

关于systick,麻烦前辈们看看

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2013-3-6
在线时间
6 小时
发表于 2013-3-6 21:54:30 | 显示全部楼层 |阅读模式
以下是代码,目的是用systick计数产生一个周期为0.5us的方波信号,供以后测试用,但是频率我弄不出来,这个好像是才100khz左右,,大家看看我哪里出错了吗?谢谢!



/****************************************************
*名  称: LPC1114测试文件 *
*功  能:   测试文件     *
*备  注: 2013.3.01 *
*****************************************************/
/**************** 头文件调用&&宏定义 ****************/
#include "LPC11xx.h"
#include "GPIO.H"


#define uchar unsigned char

#define  up_1() GPIOSetValue(PORT1,4,1)    //引脚高电平"1"
#define  down_0() GPIOSetValue(PORT1,4,0)    //引脚低电平"0"
int fac_us = 0;


/********************** 函数声明 ********************/
void UserIO(void);
void send_24bits(uchar dat1,uchar dat2,uchar dat3);

void Delay_qua_us(uint32_t nus); 
void Delay_Init(void);
void CLKOUT_EN(uint8_t CLKOUT_DIV);



/********************** 主函数 **********************/
int main(void)
{
  SystemInit(); //系统初始化,包括使能时钟
GPIOInit(); //GPIO初始化,使能GPIO模块时钟
UserIO();
Delay_Init();
CLKOUT_EN(1);

while(1)
{

up_1();    
Delay_qua_us(1);
down_0();  
Delay_qua_us(1);
}
}




/****************************************************
*名  称: UserIO     *
*参  数:   无 *
*备  注: 用户IO配置,初始化函数     *
*****************************************************/
void UserIO(void)    
{                           

GPIOSetDir(PORT1,4,1); //DATA out           
}




/*定时器初始化函数*/  
void Delay_Init() //SYSCLK为系统时钟频率除以1000000后的值,例:如果系统时钟频率为72MHz,则调用该函数时此处的实参为72  
{   fac_us = 12; // 取48 延时1us
    SysTick->CTRL |= ~(0xFFFFFFFB);   //BIT2取0用外部时钟源STCLK=HCLK/8,BIT2取1用内核时钟源FCLK=HCLK. 1011 取反变成 0100 跟原来数据想或, BIT2变成1,其它位不变。
    
}  
  
/*0.25微秒延时函数*/  
void Delay_qua_us(uint32_t nus)  
{  
    SysTick->LOAD = nus*fac_us;   //重新装入寄存器
    SysTick->VAL &= 0x00;    //清零
    SysTick->CTRL |= 0x01;     //使能定时器
while(!(SysTick->CTRL&0x00010000));//等待计数完成
    SysTick->CTRL &= 0x00;    //关闭计数器
    SysTick->VAL &= 0x00;     //清零
}  
  


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-6 22:16:55 | 显示全部楼层
回复【楼主位】bigsand:
---------------------------------
延时0.25us,这个函数,不靠谱的,调用函数及其处理时间,可能都比你的延时时间要长了。
根据我的测试,用我们的delay_us函数,延时1us,貌似时间是1.5us左右。可我实际配置的只有1us,说明在程序执行过程中的时间,还是非常可观的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2013-3-6
在线时间
6 小时
 楼主| 发表于 2013-3-6 22:23:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
那怎么样才能实现0.25us的延时呢?谢谢指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-7 00:17:37 | 显示全部楼层
不太好做.
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-3-7 04:25:46 | 显示全部楼层
32条单周期指令,还要减去调用开销。用汇编吧。
业余程序玩家。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-3-7 04:26:57 | 显示全部楼层
用定时器的pwm嘛
业余程序玩家。
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2013-3-6
在线时间
6 小时
 楼主| 发表于 2013-3-7 14:17:13 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子大哥,你好,我试了一下汇编,还是不行,麻烦你帮我看看

/****************************************************
*名  称: LPC1114测试文件 *
*功  能:   测试文件       *
*备  注: 2013.3.01 *

*****************************************************/
/**************** 头文件调用&&宏定义 ****************/
#include "LPC11xx.h"
#include "GPIO.H"


#define uchar unsigned char
#define  up_1()  GPIOSetValue(PORT1,4,1)     //"1"
#define  down_0()  GPIOSetValue(PORT1,4,0)     //"0"


/********************** 函数声明 ********************/
void UserIO(void);
void send_24bits(uchar dat1,uchar dat2,uchar dat3);
__asm void SysCtlDelay(unsigned long ulCount);



/********************** 主函数 **********************/
int main(void)
{
  SystemInit(); //系统初始化,包括使能时钟
GPIOInit(); //GPIO初始化,使能GPIO模块时钟
UserIO();
LPC_SYSCON->SYSTICKCLKDIV = 0x01;
while(1)
{

up_1();      // CODE "1"
SysCtlDelay(16);
down_0();   
SysCtlDelay(4);

}
}

/****************************************************
*名  称: UserIO     *
*参  数:   无 *
*备  注: 用户IO配置,初始化函数     *
*****************************************************/
void UserIO(void)    
{                           

GPIOSetDir(PORT1,4,1); //DATA out           
}

__asm void SysCtlDelay(unsigned long ulCount)  
{
    subs    r0, #1;                                                     /* R0减1,R0实际上就是参数ulCount*/
    bne     SysCtlDelay;                                              /* 如果结果不为0则跳转到SysCtlDelay*/
    bx       lr;                                                            /* 子程序返回                                */
 }
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2013-3-6
在线时间
6 小时
 楼主| 发表于 2013-3-7 14:18:00 | 显示全部楼层
是不是我的时钟设置错了啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-7 14:58:18 | 显示全部楼层
回复【8楼】bigsand:
---------------------------------
我会变盲哦...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-7 14:59:39 | 显示全部楼层
不过我想到另外一个办法了。
用SPI的MOSI输出你要的数据,你只要设置好SPI的时钟,就可以通过SPI->DR,来控制MOSI的数据格式,得到你想要的效果。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2013-3-6
在线时间
6 小时
 楼主| 发表于 2013-3-7 15:20:35 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
哦,好的,我再看看,谢谢。
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-4-8
在线时间
0 小时
发表于 2013-8-29 09:24:54 | 显示全部楼层
...........
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 04:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表