OpenEdv-开源电子网

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

内置温度传感,在UCOS上的一些问题

[复制链接]

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
发表于 2015-7-21 16:47:07 | 显示全部楼层 |阅读模式
5金钱
#include "Temperature.h"

void UCOS_INIT()
{
    RCC_ClocksTypeDef RCC_Clocks;
    u32 clock=0;
    RCC_GetClocksFreq(&RCC_Clocks);
    clock=RCC_Clocks.HCLK_Frequency;
    SysTick_Config(clock/OS_TICKS_PER_SEC);  //??10Ms????
}

void Temperature_init()
{
        ADC_InitTypeDef ADC_Inits;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    ADC_Inits.ADC_ContinuousConvMode=DISABLE;
    ADC_Inits.ADC_DataAlign=ADC_DataAlign_Right;
    ADC_Inits.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
    ADC_Inits.ADC_Mode=ADC_Mode_Independent;
    ADC_Inits.ADC_NbrOfChannel=1;
    ADC_Inits.ADC_ScanConvMode=DISABLE;
    
    ADC_Init(ADC1,&ADC_Inits);
    ADC_Cmd(ADC1,ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

u8 GetTemperature()
{
    ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    while(!(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)));
    return(ADC_GetConversionValue(ADC1));
}

void usart_init()
{
    USART_InitTypeDef USART_InitTy;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);   
    
    USART_InitTy.USART_BaudRate=9600;
    USART_InitTy.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitTy.USART_Mode=USART_Mode_Tx;
    USART_InitTy.USART_Parity=USART_Parity_No;
    USART_InitTy.USART_StopBits=USART_StopBits_1;
    USART_InitTy.USART_WordLength=USART_WordLength_8b;
    
    USART_Init(USART1,&USART_InitTy);
    
}

int fputc(int ch, FILE *f)
{      
    while((USART1->SR&0X40)==0);//????,??????   
    USART1->DR = (u8) ch;      
    return ch;
}
#include "stm32f10x.h"
#include "ucos_ii.h"
#include "Temperature.h"

#define TASK_STK_SIZE 512

OS_STK        TASK_ONE[TASK_STK_SIZE];
OS_STK        TASK_TWO[TASK_STK_SIZE];
OS_STK        TASK_START[TASK_STK_SIZE];

void task_one(void *p);
void task_two(void *p);
void task_start(void *p);

OS_EVENT    *message;
u8                 Temp_value=0;
INT8U            err;

int main()
{
    printf("初始化\r\n");
    UCOS_INIT();
    Temperature_init();
    usart_init();
    
    OSInit();
    printf("初始化完成\r\n");
    
    message=OSSemCreate(1);
    
    OSTaskCreate(task_start,NULL,(OS_STK *)&TASK_START[TASK_STK_SIZE-1],(INT8U)0);
    
    OSStart();
}

void task_start(void *p)
{
    p=p;
    
    OSTaskCreate(task_one,NULL,(OS_STK *)&TASK_ONE[TASK_STK_SIZE-1],1);
    OSTaskCreate(task_two,NULL,(OS_STK *)&TASK_TWO[TASK_STK_SIZE-1],2);
    printf("创建完任务\r\n");
    
    while(1)
    {
        OSTimeDlyHMSM(0,0,2,0);
    }
}

void task_one(void *p)
{
    p=p;
    
    while(1)
    {
        OSSemPend(message,0,&err);
        Temp_value=GetTemperature();
        OSTimeDlyHMSM(0,0,1,0);
        err=OSSemPost(message);
    }
}

void task_two(void *p)
{
    p=p;
    
    while(1)
    {
        OSSemPend(message,0,&err);
        printf("温度值为:%d\r\n",Temp_value);
        OSTimeDlyHMSM(0,0,1,0);
        err=OSSemPost(message);
    }
}

用的printf重定向,已勾选微库,没用仿真器,但是就是打印不出东西?求助

最佳答案

查看完整内容[请看2#楼]

回复【8楼】时代将军: --------------------------------- 先用最简单的代码,把printf搞出来先。 然后再上OS,专门就一个任务,测试printf正常不? 然后再加其他代码,加到哪一步,printf不出来了,说明就是加的这个代码有问题了。 以上是解决问题的方法。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-21 16:47:08 | 显示全部楼层
回复【8楼】时代将军:
---------------------------------
先用最简单的代码,把printf搞出来先。
然后再上OS,专门就一个任务,测试printf正常不?
然后再加其他代码,加到哪一步,printf不出来了,说明就是加的这个代码有问题了。

以上是解决问题的方法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-21 18:58:19 | 显示全部楼层
printf重定向以后不要选择微库
开往春天的手扶拖拉机
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-7-21 21:42:43 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
为什么?不是要把微库选择上吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-21 22:32:55 | 显示全部楼层
回复【3楼】时代将军:
---------------------------------
因为我们自己实现了重定向。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-7-21 22:35:10 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我把微库取消勾选还是打印不出来
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-7-21 22:37:02 | 显示全部楼层
回复【4楼】正点原子:
---------------------------
原子哥,我并没有用标准库,我没加那段代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-7-21 23:27:29 | 显示全部楼层
回复【6楼】时代将军:
---------------------------------
那你慢慢研究。
如果研究不出来,可以参考下我的例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-7-22 09:29:10 | 显示全部楼层
回复【7楼】正点原子:
------------------------------
#include "Temperature.h"

void UCOS_INIT()
{
RCC_ClocksTypeDef RCC_Clocks;
u32 clock=0;
RCC_GetClocksFreq(&RCC_Clocks);
clock=RCC_Clocks.HCLK_Frequency;
SysTick_Config(clock/OS_TICKS_PER_SEC);  //??10Ms????
}

void Temperature_init()
{
ADC_InitTypeDef ADC_Inits;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

ADC_Inits.ADC_ContinuousConvMode=DISABLE;
ADC_Inits.ADC_DataAlign=ADC_DataAlign_Right;
ADC_Inits.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_Inits.ADC_Mode=ADC_Mode_Independent;
ADC_Inits.ADC_NbrOfChannel=1;
ADC_Inits.ADC_ScanConvMode=DISABLE;

ADC_Init(ADC1,&ADC_Inits);

ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}

u8 GetTemperature()
{
ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)));
return(ADC_GetConversionValue(ADC1));
}

void usart_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);    

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  
USART_InitStructure.USART_BaudRate = baud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);    
USART_Cmd(USART1, ENABLE);
}
//int fputc(int ch, FILE *f)
//{      
// while((USART1->SR&0X40)==0);
// USART1->DR = (u8)ch;      
// return ch;
//}
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
   
    return ch;
}
#include "stm32f10x.h"
#include "ucos_ii.h"
#include "Temperature.h"

#define TASK_STK_SIZE 512

OS_STK TASK_ONE[TASK_STK_SIZE];
OS_STK TASK_TWO[TASK_STK_SIZE];
OS_STK TASK_START[TASK_STK_SIZE];

void task_one(void *p);
void task_two(void *p);
void task_start(void *p);

OS_EVENT *message;
u8  Temp_value=0;
INT8U err;

int main()
{
usart_init();
printf("???ò??????\r\n");
UCOS_INIT();
Temperature_init();
printf("????????????\r\n");

OSInit();
printf("???????ê??\r\n");

message=OSSemCreate(1);

OSTaskCreate(task_start,NULL,(OS_STK *)&TASK_START[TASK_STK_SIZE-1],(INT8U)0);

OSStart();
}

void task_start(void *p)
{
p=p;

OSTaskCreate(task_one,NULL,(OS_STK *)&TASK_ONE[TASK_STK_SIZE-1],1);
OSTaskCreate(task_two,NULL,(OS_STK *)&TASK_TWO[TASK_STK_SIZE-1],2);
printf("???¨?ê????\r\n");

while(1)
{
OSTimeDlyHMSM(0,0,2,0);
}
}

void task_one(void *p)
{
p=p;

while(1)
{
OSSemPend(message,0,&err);
Temp_value=GetTemperature();
OSTimeDlyHMSM(0,0,1,0);
err=OSSemPost(message);
}
}
void task_two(void *p)
{
p=p;

while(1)
{
OSSemPend(message,0,&err);
printf("?±?°????????%d\r\n",Temp_value);
OSTimeDlyHMSM(0,0,1,0);
err=OSSemPost(message);
}
}
这是我的程序,按你的也看了,但是我的这个就是打印不出来,不知道为什么?请原子哥帮忙看看?谢谢了
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-7-23 22:25:29 | 显示全部楼层
回复【9楼】正点原子:
哦哦,好的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 23:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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