你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm103vct6与8563通讯

[复制链接]
hhhhhhhaa 提问时间:2018-8-9 14:34 /
本帖最后由 安 于 2018-8-9 15:32 编辑

求助各位大神查看一下程序有什么问题,在运行后,大约几秒钟程序就停止了

# include <stm32f10x.h>
# include <stdio.h>
void RCC_Configuration(void);
void GPIO_Configuration(void);
void I2C_Configuration(void);
void init_8563(void);
void gettime_8563(unsigned char time[7]);
unsigned char me[7];
u32 i;
int main(void)
{
   
  RCC_Configuration();
    GPIO_Configuration();
    I2C_Configuration();

for(i=3;i<999;i++)
{
    i--;
    gettime_8563(me);
}
   
}   
void RCC_Configuration(void)//ÅäÖÃRCC
{
    //----------ʹÓÃÍⲿRC¾§Õñ-----------
    RCC_DeInit();            //³õʼ»¯ÎªÈ±Ê¡Öµ
    RCC_HSEConfig(RCC_HSE_ON);    //ʹÄÜÍⲿµÄ¸ßËÙʱÖÓ
    while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);    //µÈ´ýÍⲿ¸ßËÙʱÖÓʹÄܾÍÐ÷
   
    //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //Enable Prefetch Buffer
    //FLASH_SetLatency(FLASH_Latency_2);        //Flash 2 wait state
   
    RCC_HCLKConfig(RCC_SYSCLK_Div1);        //HCLK = SYSCLK
    RCC_PCLK2Config(RCC_HCLK_Div1);            //PCLK2 =  HCLK
    RCC_PCLK1Config(RCC_HCLK_Div2);            //PCLK1 = HCLK/2
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //PLLCLK = 8MHZ * 9 =72MHZ
    RCC_PLLCmd(ENABLE);            //Enable PLLCLK

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {   
    }        //Wait till PLLCLK is ready
   
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //Select PLL as system clock
    while(RCC_GetSYSCLKSource()!=0x08)
    {
    }        //Wait till PLL is used as system clock source
   
    //---------´ò¿ªÏàÓ¦ÍâÉèʱÖÓ--------------------
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_USART1,ENABLE);    //ʹÄÜAPB2ÍâÉèµÄGPIOAµÄʱÖÓ   
                                                            //ʹÄÜAPB2ÍâÉèµÄGPIOCµÄʱÖÓ
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
    //GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);     
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
}
void GPIO_Configuration(void)//ÅäÖÃgpio
{
  GPIO_InitTypeDef GPIO_InitStructure;
   
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
        
}

void I2C_Configuration(void)//ÅäÖÃICC
{
  I2C_InitTypeDef  I2C_InitStructure;

  // I2C configuration
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0xa2;//I2C1_SLAVE_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 100000;//I2C_Speed;
  
  I2C_Cmd(I2C1, ENABLE);
  I2C_Init(I2C1, &I2C_InitStructure);
}

void gettime_8563(unsigned char time[7])    //´Ó8563¶Áȡʱ¼ä   
{
    unsigned char data_buff[7];
    unsigned char i;

    //start=i2c_start();
  I2C_GenerateSTART(I2C1, ENABLE);
  // Test on EV5 and clear it
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
   
    //sendbyte=i2c_send_byte(0x0a2);
    I2C_Send7bitAddress(I2C1, 0xa2, I2C_Direction_Transmitter);
  // Test on EV6 and clear it
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    //sendbyte=i2c_send_byte(0x02);
  I2C_SendData(I2C1, 0x02);
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   
    //start=i2c_start();
  I2C_GenerateSTART(I2C1, ENABLE);

  // Test on EV5 and clear it
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
   
    //sendbyte=i2c_send_byte(0x0a3);
    I2C_Send7bitAddress(I2C1, 0xa3, I2C_Direction_Receiver);
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
   
    //i2c_receive_data(data_buff,7);
   
      for(i=0;i<7;i++)
    {   
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
        if(i==5)
        I2C_AcknowledgeConfig(I2C1, DISABLE);/* Disable Acknowledgement */
      if(i==6)
          I2C_GenerateSTOP(I2C1, ENABLE);
        data_buff
=I2C_ReceiveData(I2C1);
    }
    //i2c_stop();
    I2C_AcknowledgeConfig(I2C1, ENABLE);
   
   
    time[0]=data_buff[0]&0x7f;    //sec
    time[1]=data_buff[1]&0x7f;    //min
    time[2]=data_buff[2]&0x3f;    //hour
    time[3]=data_buff[3]&0x3f;    //date
    time[4]=data_buff[4]&0x07;    //week
    time[5]=data_buff[5]&0x1f;    //month
    time[6]=data_buff[6];                //year



   
}




<
收藏 评论20 发布时间:2018-8-9 14:34

举报

20个回答
hhhhhhhaa 回答时间:2018-8-9 14:37:12
:'(:'(:'(:'(
hhhhhhhaa 回答时间:2018-8-9 14:37:30
纠结啊 该怎么做呢
回答时间:2018-8-9 15:33:58
停到哪儿了?最好是仿真一下,读取到的时间是否正确?我看你的代码一直在那里读取时间。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wudianjun2001 回答时间:2018-8-9 17:04:14
读时间的话定时读就可以了,不行的话先网上找个IO口模拟IIC的程序先试试,我一般都喜欢用模拟的,不喜欢MCU自带的IIC

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

huangyanga 回答时间:2018-8-9 18:22:22
data_buff=I2C_ReceiveData(I2C1);
---------确定这样写可以?整数赋给一个指针了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-8-10 00:04:59
指针和中断有问题吗,加一个看看呢
IIC_Stop(); //产生一个停止条件
delay_ms(10);

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

freeelectron 回答时间:2018-8-10 08:57:40
1、很明显在while循环里面出不来了,一般这种都会配合超时来处理,万一外设坏了呢?
2、从机地址对不对,能不能读到?
3、示波器或者逻辑分析仪抓时需,看看

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

hhhhhhhaa 回答时间:2018-8-10 10:49:41
安 发表于 2018-8-9 15:33
停到哪儿了?最好是仿真一下,读取到的时间是否正确?我看你的代码一直在那里读取时间。 ...

读取的太频繁了,导致整个系统崩溃了,加了一个延时就好了,据说可以把读取放到定时器里定时读取,怎么编写定时器呢?
hhhhhhhaa 回答时间:2018-8-10 10:50:27
freeelectron 发表于 2018-8-10 08:57
1、很明显在while循环里面出不来了,一般这种都会配合超时来处理,万一外设坏了呢?
2、从机地址对不对,能 ...

就是想让它一直读8563里的时间,结果就是太频繁了,加了一个延时就好了
读取的太频繁了,导致整个系统崩溃了,加了一个延时就好了,据说可以把读取放到定时器里定时读取,怎么编写定时器呢?
123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版