我最初的思路是想往24C02写入数据,然后读出的数据赋值给LED灯,或者读出的数据在串口中显示出来,但是没有成功,困扰了我两天,另外还发现了一个BUG,当我配置USART_ITConfig(USART1, USART_IT_TXE, ENABLE);串口发送中断使能的时候,GPIOA->BSRR = 11<<2;这些I/O寄存器语句会失效,不知道为什么,代码我是用原子的myiic,24cxx的,然后还有一个主函数,我贴主函数出来,请大家帮忙分析下。myiic,24cxx是没改动过的,我的板子的I/O口不是和原子的一样,这里我也改动过了。
#include "delay.h"
#include "sys.h"
#include "myiic.h"
#include "24cxx.h"
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE); //????PA?????±??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//GPIO_SetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_3);
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_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//USART ?????è??
USART_InitStructure.USART_BaudRate = 9600;//??°??è????9600; ???????????????? 8??????×???
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //×??¤
USART_InitStructure.USART_StopBits = USART_StopBits_1; //????????????°??¨????é???????????è????1????
USART_InitStructure.USART_Parity = USART_Parity_No; //?????????ì?é????
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //?????????÷????
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //?????®??????????
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
//void USART1_IRQHandler(void) //??????,???????????
//{
// u16 temp_trx;
// if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//?? ?? ????
// {
// temp_trx = USART_ReceiveData(USART1);
// GPIOA->ODR = USART_ReceiveData(USART1);
// //AT24CXX_WriteOneByte(10,0x0c);
// //USART_SendData(USART1,AT24CXX_ReadOneByte(10));
// USART_SendData(USART1,temp_trx);
// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//?? ????
// }
//}
int main()
{
GPIO_init();
//GPIOA->BSRR = 11<<2;
AT24CXX_Init();
AT24CXX_WriteOneByte(0,0x0c);
GPIOA->ODR = AT24CXX_ReadOneByte(0);
while(1)
{
USART_SendData(USART1,AT24CXX_ReadOneByte(0));
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//?? ????
}
}
|