这两天在调试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();
}
|