OpenEdv-开源电子网

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

DS1820的程序从stm32F103(无OS)移植到stm32H750(FreeRTOS)

[复制链接]

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
发表于 2021-8-17 08:50:46 | 显示全部楼层 |阅读模式
18金钱
本帖最后由 ColeSofCJ 于 2021-8-17 08:53 编辑

    如题,DS18B20的程序移植,原先在stm32F103上可以正常使用的,移植到stm32H750后两个DS18B20只有一个能读取到当前温度值0x01D3左右,另一个返回0xffff,两个DS18B20使用两个不同的.c和.h包含文件,但经过仔细核对,代码部分除了端口不一样,其余都是相同的。奇怪的是,能读取到数值的那段程序,换另一个传感器的端口读取也是可以读的,说明问题和硬件无关,就出在软件部分,但软件部分除了分开两个任务单独读取外,其余也没有多大差别。因.h文件内容不多,原先是两个传感器共用一个.h文件,后来看分开会不会好一点,结果两个传感器都无法读取到当前温度值了,这两个传感器任务的优先级调整过,高低都不行,任务切换时间是默认的1000HZ.
   发个帖子看看有没有谁在FreeRTOS上调试过DS18B20遇到过类似情况的,不行的话就要想其它办法了!

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

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-8-17 10:06:56 | 显示全部楼层
FreeRTOS有定时中断,假如操作单总线时某些关键时刻被中断,那是会出问题的,“临界区”了解一下。
专治疑难杂症
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-8-17 10:16:59 | 显示全部楼层
和SPI读写外部flash类似,操作讲究连续性,
    taskENTER_CRITICAL();        //进入临界区
        /*
    具体操作
    */
    taskEXIT_CRITICAL();       
这样把你的相关协议代码套进去
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2021-8-17 11:05:32 | 显示全部楼层
本帖最后由 ColeSofCJ 于 2021-8-17 11:10 编辑
lpwithv 发表于 2021-8-17 10:16
和SPI读写外部flash类似,操作讲究连续性,
    taskENTER_CRITICAL();        //进入临界区
        /*

非常感谢,我在移植的时候把原先开关滴答中断的地方改成taskENTER_CRITICAL(); taskEXIT_CRITICAL();  了,也可能是其它定时中断有影响,现在是蛮乱的,有时改A传感器的代码会导致B传感器不响应(看着传感器的初始化部分和pdf文档里面的时序有点差异,就按pdf文档里面改了,结果没改前是A响应B不响应,渐渐变成AB都不响应,改后变成A不响应,B正常了)。
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2021-8-17 11:19:32 | 显示全部楼层
LcwSwust 发表于 2021-8-17 10:06
FreeRTOS有定时中断,假如操作单总线时某些关键时刻被中断,那是会出问题的,“临界区”了解一下。

现在是这样的: void GetT1_Thread4(void  *argument)
{
  uint16_t T1;
  (void) argument;       
        for(;;)
        {
                vTaskSuspendAll();
          T1=GetTemp_Add();
                xTaskResumeAll();
                vTaskDelay(5);
        }
}


void GetT2_Thread5(void  *argument)
{
  uint16_t T2;
  (void) argument;
        for(;;)
        {
                vTaskSuspendAll();
          T2=GetTemp_PIPE();
                xTaskResumeAll();
                vTaskDelay(5);
        }
}  我把任务挂起恢复改成进出临界区试试
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2021-8-17 11:30:21 | 显示全部楼层
LcwSwust 发表于 2021-8-17 10:06
FreeRTOS有定时中断,假如操作单总线时某些关键时刻被中断,那是会出问题的,“临界区”了解一下。

  加了临界区,不用的定时中断关掉,还是一个正常一个不正常,不知道和我不熟悉FreeRTOS是不是有关系,之前用时间触发嵌入式的时候稳定性很好,没有这些奇怪的问题!
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2021-8-17 11:36:07 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-8-17 11:40 编辑
ColeSofCJ 发表于 2021-8-17 11:30
加了临界区,不用的定时中断关掉,还是一个正常一个不正常,不知道和我不熟悉FreeRTOS是不是有关系,之 ...

看来,只能用示波器测一下引脚波形参照其时序看是否有问题,宽度、边沿时间是否有问题。

检查引脚配置、上拉电阻、是否有其它功能占用了引脚、是否需要REMAP等。
专治疑难杂症
回复

使用道具 举报

13

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
749
金钱
749
注册时间
2020-6-24
在线时间
311 小时
 楼主| 发表于 2021-8-17 12:40:17 | 显示全部楼层
LcwSwust 发表于 2021-8-17 11:36
看来,只能用示波器测一下引脚波形参照其时序看是否有问题,宽度、边沿时间是否有问题。

检查引脚配置 ...

   发两张图片,分别是在FREERTOS启动前在初始化部分直接读取温度和FREERTOS启动后在任务中读取温度,一个是A传感器可以读取,B返回0xffff,另一个情况则是A返回0xffff,B可以读取到数据,有点玄幻了啊!
RunInInit.png
RunInTask.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 06:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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