DOC

STM32-18B20-24C02

By Cheryl Lane,2014-09-23 17:36
6 views 0
STM32-18B20-24C02C,stm32,18b20

//24c02.c//

    #include "stm32f10x.h"

    #include "systic.h"

// SCL = GPIOD_Pin_2

    // SDA = GPIOD_Pin_1

    uint8_t ask;

    void start_iic(void){

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(1);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5); //大于4.7us

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(5); //锁住>4us

     GPIO_ResetBits(GPIOD,GPIO_Pin_2); //钳住iic总线!准备收发数据。

     Delay_us(2);

    }

void stop_iic(void){

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(5);

    }

void sendbyte(uint8_t ch){

     uint8_t i;

     for(i=0;i<8;i++){ //high

     if((ch<<i)&0x80)

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     else

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(1);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(1);

     }

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

     if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)==1)

     ask=0;

     else

     ask=1;

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(1);

}

    uint8_t recbyte(void){

     uint8_t buf;

     uint8_t i;

     buf=0;

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     for(i=0;i<8;i++){

     Delay_us(2);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(1);

     buf<<=1;

     if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)==1)

     buf+=1;

     Delay_us(2);

     }

     //GPIO_ConfigDOUT();

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

     return buf;

    }

void Asko(void){

     GPIO_ResetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

    }

    void Noask(void){

     GPIO_SetBits(GPIOD,GPIO_Pin_1);

     Delay_us(2);

     GPIO_SetBits(GPIOD,GPIO_Pin_2);

     Delay_us(5);

     GPIO_ResetBits(GPIOD,GPIO_Pin_2);

     Delay_us(2);

}

uint8_t Sendstr(uint8_t add,uint8_t cadd,uint8_t *buf,uint8_t n){

     uint8_t i;

     start_iic();

     sendbyte(add);

     if(ask==0)

     return 0;

     sendbyte(cadd);

     if(ask==0)

     return 0;

     for(i=0;i<n;i++){

     sendbyte(*buf);

     if(ask==0)

     return 0;

     buf++;

     cadd++;

     }

     Delay_us(1000000);

     stop_iic();

     return 1;

}

uint8_t Recstr(uint8_t add,uint8_t cadd,uint8_t *buf,uint8_t n){

     uint8_t i;

     start_iic();

     sendbyte(add);

     if(ask==0)

     return 0;

     sendbyte(cadd);

     if(ask==0)

     return 0;

     start_iic();

     sendbyte(add+1);

     if(ask==0)

     return 0;

     for(i=0;i<n-1;i++){

     *buf=recbyte();

     Asko();

     buf++;

     }

     *buf=recbyte(); //主机作为接收器时!数据最后一个字节后

     Noask(); //必须跟一个“不应答”表示结束接收

     Delay_us(1000000);

     stop_iic();

     return 1;

}

//////////////////////usart.c////////////////////////////////

    #include "stm32f10x.h"

    #include "usart.h"

    #include <stdio.h>

    #define SENDBUFF_SIZE 1024

    extern vu8 SendBuff[SENDBUFF_SIZE] ;

    extern uint16_t temp;

    extern uint8_t RecBuff[1024];

void GPIO_Config(void)

    {

     GPIO_InitTypeDef GPIO_InitStruct;

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP; //USART1 TX

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_9;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOA, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_OD;/IIC EEPRM 外接3.3V/4.7K

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_1|GPIO_Pin_2;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOD, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING; //USART1 RX

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_10;

     GPIO_Init(GPIOA, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP; //LED

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_9;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOB, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP; //18B20

     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;

     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

     GPIO_Init(GPIOC, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //EXTI0 KEY1

     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; // 上拉输入

     GPIO_Init(GPIOC, &GPIO_InitStruct);

}

void USART1_Config(void)

    {

     USART_InitTypeDef USART_InitStructure;

     USART_InitStructure.USART_BaudRate = 9600;

     USART_InitStructure.USART_WordLength = USART_WordLength_8b;

     USART_InitStructure.USART_StopBits = USART_StopBits_1;

     USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验

     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

     USART_Init(USART1, &USART_InitStructure);

     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

     //USART_ITConfig(USART1, USART_IT_TC, ENABLE);

     USART_Cmd(USART1, ENABLE);

    }

void DMAT_Config(void)

    { //uint8_t n;

     DMA_InitTypeDef DMA_InitStructure;

    // for(n=0;n<6;n++)

    // SendBuf[n]=n+'0';

     DMA_DeInit(DMA1_Channel4);//USART1DMA1传送通道 CHANNEL 4

     DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE+4; //地址

     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RecBuff; //地址

    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//DMA的目的

    DMA_InitStructure.DMA_BufferSize = 6; //传输大小

     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加

     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增 1

null

     if (HSEStartUpStatus == SUCCESS) {

     /* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */

     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //* 利用锁相环讲外

    8Mhz晶振9倍频到72Mhz */

     RCC_PLLCmd(ENABLE); //* Enable PLL

     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //* Wait till PLL is ready

     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //* Select PLL as system clock source

     while (RCC_GetSYSCLKSource() != 0x08); //* Wait till PLL is used as system clock source

     RCC_HCLKConfig(RCC_SYSCLK_Div1); //* HCLK = SYSCLK

     RCC_PCLK2Config(RCC_HCLK_Div1); //* PCLK2 = HCLK

     RCC_PCLK1Config(RCC_HCLK_Div2); //* PCLK1 = HCLK/2

     }

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOD, ENABLE);

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

}

//不使用半主机模式

    #if 1 //如果没有这段!则需要在target选项中选择使用USE microLIB

    #pragma import(__use_no_semihosting)

    struct __FILE

    {

     int handle;

    };

    FILE __stdout;

_sys_exit(int x)

    {

     x = x;

    }

    #endif

//SYSTICK.C//////

    #include "Systic.h"

    #include "misc.h"

    static __IO u32 TimingDelay;

void SysTick_Init(void)

    {

     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

     if (SysTick_Config(SystemCoreClock /1000000)) // 1/1000000=1 US /72MHz

     while (1);

     SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; //DISABLE TICK

    }

    void Delay_us(__IO u32 nTime) {

     TimingDelay = nTime;

     // ENABLE SYSTICK

     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

     while(TimingDelay != 0);

    }

    void TimingDelay_Decrement(void) {

     if (TimingDelay != 0x00)

     {

     TimingDelay--;

     }

    }

    //stm32f10x_it.c////////////////// extern uint8_t Rflag;

    void EXTI0_IRQHandler(void){

     if(EXTI_GetITStatus(EXTI_Line0) != RESET) //确保是否产生了EXTI Line中断

     {

     EXTI_ClearITPendingBit(EXTI_Line0); //清除中断标志位

     Rflag++;

     if(Rflag==1)

     GPIO_SetBits(GPIOB,GPIO_Pin_6);

     if(Rflag==2){

     GPIO_ResetBits(GPIOB,GPIO_Pin_6);

     GPIO_SetBits(GPIOB,GPIO_Pin_9);

     }

     if(Rflag>2){

     GPIO_ResetBits(GPIOB,GPIO_Pin_9);

     Rflag=0;

     }

     }

    }

#ifndef CTRT

    void USART1_IRQHandler(void)

    {

     if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)

     {

     USART_ClearITPendingBit(USART1,USART_IT_TC);

     USART_ClearFlag(USART1,USART_FLAG_TXE);

     //Rflag=1;

     }

     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

     {

     //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题

     USART_ClearITPendingBit(USART1,USART_IT_RXNE);

     USART_ClearFlag(USART1,USART_FLAG_ORE);

     //if(USART_ReceiveData(USART1)=='3'){ // USARTx->DR

     // Rflag=~Rflag;

     //}

     }

}

    #endif

void SysTick_Handler(void)

    {

     TimingDelay_Decrement();

    }

//18b20.c///////////////

    #include "stm32f10x.h"

    #include "usart.h"

    #define SENDBUFF_SIZE 6

    extern vu8 SendBuff[SENDBUFF_SIZE]; void Delay_us(uint32_t n);

void GPIO_ConfigIN(void);

    void GPIO_ConfigOUT(void);

    extern uint16_t templ;

/*------------------------------------------------

     18b20初始化

    ------------------------------------------------*/

    void Init_DS18B20(void)

    {

     GPIO_ConfigOUT();

     GPIO_SetBits (GPIOC,GPIO_Pin_7); //DQ复位

     Delay_us(10); //稍做延时 10us

     GPIO_ResetBits(GPIOC,GPIO_Pin_7); //单片机将DQ拉低

     Delay_us(550); //大于 480us 小于960us

     GPIO_SetBits (GPIOC,GPIO_Pin_7); //拉高总线

     GPIO_ConfigIN();

     Delay_us(40); //15~60us 接收60-240us的存在脉冲

     while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)); //如果x=0则初始化成功, x=1则初始化失败

     Delay_us(300); //稍作延时返回 30x10 us

     GPIO_ConfigOUT();

    }

/*------------------------------------------------

     读取一个字节

    ------------------------------------------------*/

    uint16_t ReadOneChar(void)

    {

    uint8_t i=0;

    uint8_t dat = 0;

    for (i=8;i>0;i--)

     {

     dat>>=1;

     GPIO_ConfigOUT();

     GPIO_ResetBits(GPIOC,GPIO_Pin_7);

     Delay_us(4); //high-low init 18b20

     GPIO_SetBits(GPIOC,GPIO_Pin_7); //+

     GPIO_ConfigIN();

     Delay_us(6);

     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7))

     dat|=0x80;

     Delay_us(57);

     }

     return(dat);

Report this document

For any questions or suggestions please email
cust-service@docsford.com