Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 20:57

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: STM32L + сенсорная библиотека.
СообщениеДобавлено: 25 июл 2012, 20:08 
Заглядывает иногда

Зарегистрирован: 21 окт 2011, 09:25
Сообщения: 71
Откуда: Уфа
Всем привет. ПОмогите разобраться. Не могу запустить сенсорные кнопки на дискавери борде. Когда ввожу функции, то при работе срабатывает прерывание HardFault_Handler.
Делал по примеру статьи http://we.easyelectronics.ru/STM32/ispolzuem-sensornuyu-klaviaturu-na-stm32l-discovery.html и по документации на библиотеку.
Код:

Код:
#include "stm32l1xx.h"
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include "discover_board.h"

-------------------------------------------------------------------
#include "stm32_tsl_api.h"
#define SLIDER_DETECTED (sMCKeyInfo[0].Setting.b.DETECTED)
#define SLIDER_POSITION (sMCKeyInfo[0].UnScaledPosition)
-------------------------------------------------------------------


void Delay_ms(__IO uint32_t nTime);
void TimingDelay_Decrement(void);

void USART2_Init(unsigned int baud);
void I2C2_Init(void);
void ReadTemp(void);
void ADC1_Init(void);
uint16_t ADC_GetValue(uint8_t channel);


void LEDS_Init(void);

static __IO uint32_t TimingDelay;
void print(const char* str);
void send(uint8_t data);
char read(void);


uint8_t tmpH, tmpL;

ADC_InitTypeDef         ADC_InitStructure;
USART_InitTypeDef       USART_InitStructure;
GPIO_InitTypeDef        GPIO_InitStructure;
USART_ClockInitTypeDef  USART_ClockInitStruct;
RCC_ClocksTypeDef       RCC_Clocks;
EXTI_InitTypeDef        EXTI_InitStructure;
NVIC_InitTypeDef        NVIC_InitStructure;
I2C_InitTypeDef         I2C_InitStructure;

void RCC_Init(void)
{
   /* Enable the GPIOs Clock */
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH, ENABLE);
   /* Enable the I2C2, USART2 Clock */
   RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2 | RCC_APB1Periph_I2C2, ENABLE );
   /* Enable SYSCFG */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
   /* Enable ADC1 clock */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

   /*Запускаем тактирование АЦП*/
   RCC_HSICmd(ENABLE);// Enable The HSI (16Mhz)
   /* Check that HSI oscillator is ready */
   while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

   /*Config SysTick for delay*/
   RCC_GetClocksFreq(&RCC_Clocks);
   SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
}

int main(void)
{
    char temperature[16];
    char humidity[16];
    char RH[16];
    uint16_t Vlazhnost;
    //uint16_t temperature;

    RCC_Init();
    I2C2_Init();
    ADC1_Init();
    LEDS_Init();

-------------------------------------------------------------------
   TSL_Init();
   sMCKeyInfo[0].Setting.b.IMPLEMENTED = 1;
   sMCKeyInfo[0].Setting.b.ENABLED = 1;
   sMCKeyInfo[0].DxSGroup = 0x00;
-------------------------------------------------------------------
   USART2_Init(115200);

   Delay_ms(10);
   print("STM32L-Discovery example. ");
   print("I2C temperature sensor with 12bit precision. ");
   print("Humidity measurement with ADC1 12 bit resolution.\r\n");
   while (1)
   {
-------------------------------------------------------------------
      TSL_Action();

      if ((SLIDER_DETECTED)&&(TSLState == TSL_IDLE_STATE))
      {
         if( SLIDER_POSITION <= 25 )
         GPIO_HIGH(LD_PORT, LD_GREEN);
      }

-------------------------------------------------------------------

      ReadTemp();
      Vlazhnost = ADC_GetValue(ADC_Channel_1);
      float Vout = ((float)Vlazhnost)*3/4096;
      float SensorRH = ((Vout/3)-0.16)/0.0062;
      sprintf(temperature, "%d.%dC\r\n", tmpH, tmpL);
      sprintf(RH, "%d\r\n", Vlazhnost);
      print(temperature);
      print(gcvtf(SensorRH, 3, humidity));
      Delay_ms(1000);
   }
   return 0;
}

void LEDS_Init(void)
{
   GPIO_InitStructure.GPIO_Pin = LD_GREEN;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_Init(LD_PORT, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin = LD_BLUE;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_Init(LD_PORT, &GPIO_InitStructure);

   GPIO_HIGH(LD_PORT, LD_GREEN);
   GPIO_HIGH(LD_PORT, LD_BLUE);
   Delay_ms(100);
   GPIO_LOW(LD_PORT, LD_GREEN);
   GPIO_LOW(LD_PORT, LD_BLUE);
}

void USART2_Init(unsigned int baud)
{

   /* Configure USART Tx and Rx as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;            // Rx Pin
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   /* Connect PXx to USARTx_Tx */
   GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,  GPIO_AF_USART2);
   /* Connect PXx to USARTx_Rx */
   GPIO_PinAFConfig(GPIOA, GPIO_PinSource3,  GPIO_AF_USART2);

   USART_ClockStructInit(&USART_ClockInitStruct);
   USART_ClockInit(USART2, &USART_ClockInitStruct);

   USART_InitStructure.USART_BaudRate = baud;
   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_Rx | USART_Mode_Tx;
   USART_Init(USART2, &USART_InitStructure);
   USART_Cmd(USART2, ENABLE);
}

void I2C2_Init(void)
{
   /*I2C Init */
   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
   I2C_InitStructure.I2C_OwnAddress1 = 0x00;
   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
   I2C_InitStructure.I2C_ClockSpeed = 100000;
   I2C_Init(I2C2, &I2C_InitStructure);
   I2C_Cmd(I2C2, ENABLE);

   /* Connect PXx to I2C_SCL */
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2);

   /* Connect PXx to I2C_SDA */
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2);

   /*!< Configure I2C SCL pin */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

   /*!< Configure I2C SDA pin */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void ReadTemp(void)
{
   //uint16_t temp;
   /* While the bus is busy */
   while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
   /* Send START condition */
   I2C_GenerateSTART(I2C2, ENABLE);
   /* Test on EV5 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
   /* Send TMP100 address for write */
   I2C_Send7bitAddress(I2C2, 0x90, I2C_Direction_Transmitter);
   /* Test on EV6 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   /*set TMP100 register*/
   I2C_SendData(I2C2, 0x01);
   /* Test on EV8 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   /*set TMP100 register value*/
   I2C_SendData(I2C2, 0x60); //12 bit
   /* Test on EV8 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   /* Send stop condition */
   I2C_GenerateSTOP(I2C2, ENABLE);

   Delay_ms(320);

   /* Send START condition */
   I2C_GenerateSTART(I2C2, ENABLE);
   /* Test on EV5 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
   /* Send TMP100 address for write */
   I2C_Send7bitAddress(I2C2, 0x90, I2C_Direction_Transmitter);
   /* Test on EV6 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   /*set TMP100 register*/
   I2C_SendData(I2C2, 0x00);
   /* Test on EV8 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

   /* Send RESTART condition */
   I2C_GenerateSTART(I2C2, ENABLE);
   /* Test on EV5 and clear it */
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
   /* Send TMP100 address for read */
   I2C_Send7bitAddress(I2C2, 0x91, I2C_Direction_Receiver);
   while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    /* Test on EV6 and clear it */
   //while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED));

   I2C_AcknowledgeConfig(I2C2, ENABLE);
   while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED));
   tmpH=I2C_ReceiveData(I2C2);


    I2C_AcknowledgeConfig(I2C2, DISABLE);
   while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED));
    tmpL=I2C_ReceiveData(I2C2);


    /* Send STOP Condition */
    I2C_GenerateSTOP(I2C2, ENABLE);
    //temp = (((uint16_t)(tmpH))<<8)|((uint16_t)(tmpL));

    tmpL = tmpL/25.6;
    //return tmpH;
    //return tmpL;

}

void ADC1_Init(void)
{

   /* Configure PA.1 (ADC Channel1) in analog mode */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AN;
   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   ADC_StructInit(&ADC_InitStructure);
   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
   ADC_InitStructure.ADC_ScanConvMode = ENABLE;
   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
   ADC_InitStructure.ADC_NbrOfConversion = 1;
   ADC_Init(ADC1 , &ADC_InitStructure);

   /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    /* Wait until the ADC1 is ready */
   while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET){}



}

uint16_t ADC_GetValue(uint8_t channel)
{
   uint16_t ADCdata;
   /* ADC1 regular channel_1 configuration on PA1 */
   ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_4Cycles);
   /* Start ADC1 Software Conversion */
   ADC_SoftwareStartConv(ADC1);
   while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET){}
   ADCdata = ADC_GetConversionValue(ADC1);
   return ADCdata;
}

void print(const char* str)
{
    int i = 0;
    uint8_t CHAR_ID;
    while(str[i])
    {
        USART_SendData(USART2, (uint8_t) str[i]);
        CHAR_ID = str[i];
        i++;
        while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}
    }
}

void send(uint8_t data)
{
   USART_SendData(USART2, data);
   while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}
   USART_ClearFlag(USART2, USART_FLAG_TC);
}

char read(void)
{
   char data;
   if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)
   {
      data = USART_ReceiveData(USART1);
   }
   return data;

}

void Delay_ms(__IO uint32_t nTime)
{
   TimingDelay = nTime;
    while(TimingDelay != 0);
}

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32L + сенсорная библиотека.
СообщениеДобавлено: 26 июл 2012, 01:30 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
Посмотри сначала, что тебя приводит в HardFault. В Keil смотри в меню Peripherals.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB