OpenEdv-开源电子网

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

串口输出问题,还有systick延时问题

[复制链接]

21

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-6-8
在线时间
79 小时
发表于 2016-7-4 18:17:21 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]#define RESULT1      "SDP600检测到压差数据:"
#define RESULT2      "SDP600检测压差数据出错"
#define SDP600_UNIT  "Pa"
void main()
{
  etError error;
  signed short difPressure;                 //这里的int是32位的
  SystemConfig();
  DelayConfig();
  SDP_Init(0x40);      //I2C地址默认0x40
while(1)
  {
    error = SDP600_ReadDifferentialPressure(&difPressure);
    if(error == NO_ERROR)
    {
      signed char buffer[6];
      RS485_Read(&com,RESULT1,sizeof(RESULT1)-1);
      sprintf(buffer,"%d",difPressure);      //数据修正问题
      RS485_Read(&com,SDP600_UNIT,2);        //问题1:这里能输出单位
      RS485_Read(&com,&buffer[0],6);         //最长情况-32700,6位
      RS485_Read(&com,SDP600_UNIT,2);        //问题1:这里不能输出单位
      Delay_us(1000000);
      //Delay_ms(1000);                      //问题2:使用ms级别的delay程序会死掉
    }
    else
    {
      RS485_Read(&com,RESULT2,sizeof(RESULT2)-1);
      Delay_us(1000000);
      //Delay_ms(1000);
    }
}[/mw_shl_code]

Dleay文件
[mw_shl_code=c,true]/*不使用中断产生延时*/
#include "systick.h"
#include "stm32f10x.h"

static unsigned int factor_us = 0;
static unsigned int factor_ms = 0;

void DelayConfig()
{
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    // 1MHz
  factor_us = SystemCoreClock/1000000;                     // 延时1us
  factor_ms = 1000 * factor_us;
}

void Delay_us(unsigned int time)
{
  SysTick->LOAD = time * factor_us - 1;
  SysTick->VAL  = 0;
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;                    // 开启systick
  while((SysTick->CTRL & 0x01) && !(SysTick->CTRL & (1<<16))); // 使能SysTick并且还没计数到0
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                   // 关闭systick
  SysTick->VAL = 0;
}

void Delay_ms(unsigned int time)
{
  SysTick->LOAD = time * factor_ms - 1;
  SysTick->VAL  = 0;
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;                    // 开启systick
  while((SysTick->CTRL & 0x01) && !(SysTick->CTRL & (1<<16))); // 使能SysTick并且还没计数到0
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                   // 关闭systick
  SysTick->VAL = 0;
}[/mw_shl_code]

我串口那个在输出数字之后就不能输出单位了,如果把单位放在前面输出,又是可以的。
还有我同样的用systick进行延时,为什么使用us级别的那个我程序运行的时候不会卡住,
但是使用ms级别之后中途会卡住。
指教大家

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-6 22:31:08 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 12:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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