OpenEdv-开源电子网

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

调用标准例程-V3.5库函数版本实验22 IIC实验在FreeRTOS环境下死机

[复制链接]

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
发表于 2014-3-4 09:40:20 | 显示全部楼层 |阅读模式
     这两天在调试AT24C02时,直接将标准例程-V3.5库函数版本实验22 IIC实验中的24cxx.c,24cxx.h,myiic.c,myiic.h四个文件拷贝到我的工程下面,我用的是FreeRTOS,例程中用的是I2C2,我的板子是I2C1,故我将I2C端口改成了PB6,PB7,在myiic.c,myiic.h文件中修改.在串口中断中设置一个值到EEPROM中,在task_1中读出并发送给串口上显示,这样程序就死机了,将task_1中temp = AT24CXX_ReadOneByte(0x10)注释,LED灯闪烁正常,在串口中断中设置写EEPROM程序也会死机。同样的功能我在标准例程-V3.5库函数版本实验22 IIC实验中修改,程序OK,EEPROM读写都成功的,这是不是和跑系统有关啊?请各位大侠帮忙指点一下。
myiic.c中修改如下:
void IIC_Init(void)
{     
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
}
myiic.h中修改如下:
//IO方向设置
#define SDA_IN()   {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;} 
#define SDA_OUT()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x30000000;}

//IO操作函数  
#define IIC_SCL    Bout(6) //SCL
#define IIC_SDA    Bout(7) //SDA  
#define READ_SDA   PBin(7)  //输入SDA 

mian.c
int main(void)
{
NVIC_Configuration();//中断向量表和中断分组 16位抢占优先级0位子优先级 
LED_GPIO_Config();
UART1_Configuration();
UART3_Configuration();
Adc_Init();
AT24CXX_Init();

xTaskCreate( task_1, ( signed portCHAR * ) "MAIN", configMINIMAL_STACK_SIZE, NULL, 0, NULL );
xTaskCreate( task_3, ( signed portCHAR * ) "UART2", configMINIMAL_STACK_SIZE, NULL, 1, NULL );
  
vTaskStartScheduler();
return 0;
}

static void task_1( void *parameters )
{
u8 temp;
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
GPIO_SetBits(GPIOC, GPIO_Pin_1); // turn on led
temp = AT24CXX_ReadOneByte(0x10);
USART1_SendChar(temp);
vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_RATE_MS ) );
GPIO_ResetBits(GPIOC, GPIO_Pin_1); // turn off led
vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_RATE_MS ) );
}
}
void USART1_IRQHandler(void)                 //串口1中断服务程序
{
u8 uart_data;
taskENTER_CRITICAL();
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
uart_data =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
AT24CXX_WriteOneByte(0x10,uart_data);
USART1_SendChar(uart_data);
taskEXIT_CRITICAL();




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

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-4 11:19:47 | 显示全部楼层
上传源码,请各位帮忙看一下!

stm32f10x_lib_freertos_IIC.zip

3.31 MB, 下载次数: 714

回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-4 12:06:18 | 显示全部楼层
刚刚用UCOSII,EEPROM读写都没有问题,在实验53 UCOSII入门实验1-2-任务创建删除挂起恢复上修改的,难道是FreeRTOS引起的?原子哥,能帮忙看一下吗?

实验53 UCOSII入门实验1-2-任务创建删除挂起恢复 - 副本.zip

5.1 MB, 下载次数: 303

回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 13:07:01 | 显示全部楼层
是不是同时调用24C02的写入或者读取啦?造成冲突的,中断优先级什么的要设置好,具体不是很懂
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-4 13:22:17 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
不是写入或者读取的冲突,我现在没有中断,直接在任务中读取就死机了
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 13:23:10 | 显示全部楼层
回复【5楼】elsie_ye:
---------------------------------
这。。。

JTAG跟踪调试一下AT24CXX_ReadOneByte(0x10);这个函数看这个函数里面哪部死机的,或者用示波器或者逻辑分析仪抓下这个读取波形看下什么样子的,这样直观一点
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-4 13:28:35 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
非常感谢您的回复,用示波器还没量到就死机了,那我用JTAG试试看。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-4 13:32:04 | 显示全部楼层
回复【7楼】elsie_ye:
---------------------------------
恩,估计还没到达这个函数就死机了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-5 10:36:22 | 显示全部楼层
回复【8楼】Badu_Space:
---------------------------------
用了Jlink调试发现程序死在延时函数里面,延时函数复制了标准例程-V3.5库函数版本实验22 IIC实验中delay.c,delay.h,FreeRTOS不能用普通单机的延时函数,后来改成FreeRTOS的延时方式,程序OK了。
另外请教一个问题:我原来的keil工程用调试模式时,箭头不能进入c文件窗口,只能在反汇编窗口跳来跳去,为什么?我是后来换了一个工程做了以上的调试。我在网上查了有以下原因,都试了不行。
  1.进入Option for target'xxxx'-->debug-->run to main()打钩
  2.output-->Debug Information打钩
  请教一下还有什么原因能够造成箭头不能进入c文件窗口?大家都帮忙回复一下好吗?谢谢了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-5 10:52:16 | 显示全部楼层
不好意思啊,就是以上那两个原因引起的,可能之前没设置好,所以不行,刚刚又试了一下是可以的。
感谢Badu_Space!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-5 12:53:33 | 显示全部楼层
回复【9楼】elsie_ye:
---------------------------------
CM3内核的话可以用这种方式做延时http://www.openedv.com/posts/list/22061.htm
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-5 13:38:00 | 显示全部楼层
回复【11楼】Badu_Space:
---------------------------------
感谢!感谢!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-5 13:55:53 | 显示全部楼层
回复【9楼】elsie_ye:
---------------------------------
我试过是外部的高速晶振没就绪造成的,其他的没发现什么,不过用4.7版本的MDK就没进过main,不知道其他老大们有没试过
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-5 16:59:56 | 显示全部楼层
回复【11楼】Badu_Space:
---------------------------------
您介绍的延时函数,刚才试了,非常好用,感谢分享!

以下是我改的FreeRTOS延时函数,delay_us()可以用,I2C读没有问题,但是I2C写中调用delay_ms()还是会死机呢,于是就把24cxx.c里面的AT24CXX_WriteOneByte 中delay_ms(10)去掉了。

#define portTICK_RATE_US ( ( portTickType ) 1 / configTICK_RATE_HZ )

void delay_ms(u16 nms)
{  
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
vTaskDelayUntil( &xLastWakeTime, ( nms / portTICK_RATE_MS ) );
}
        
void delay_us(u32 nus)
{
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
vTaskDelayUntil( &xLastWakeTime, ( nus / portTICK_RATE_US ) );
}
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-5 17:19:06 | 显示全部楼层
回复【14楼】elsie_ye:
---------------------------------
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2013-9-24
在线时间
4 小时
 楼主| 发表于 2014-3-5 17:21:10 | 显示全部楼层
回复【15楼】Badu_Space:
---------------------------------
知道为什么不行吗?理论上应该可以的吧
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-5 17:25:08 | 显示全部楼层
回复【16楼】elsie_ye:
---------------------------------
理论上可以不一定在实际上面可以
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 16:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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