24.03.2017, 16:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Функция из main.c,вызов из подключенного файла
В майн определяю функцию delay_us(void),которая работает от прерываний таймера в майн файле и пытаюсь вызывать в подключенном файле.
main.h
PHP код:
|
#ifndef MAIN_H
#define MAIN_H
#define RTE_DEVICE_STDPERIPH_GPIO
#define RTE_DEVICE_STDPERIPH_RCC
#define RTE_DEVICE_STDPERIPH_TIM
#define RTE_DEVICE_STDPERIPH_ADC
#include "stm32f10x.h"
#include "stm32f10x_conf.h"
#include "init.h"
#include "adc.h"
#include "1-Wire.h"
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC
#endif
|
main.c
PHP код:
|
#include "main.h"
//
uint32_t delay_tick=0;
uint16_t flag_tick=0;
uint16_t delay_count=0;
uint16_t flag_count=0;
uint16_t temp_pwm=0;
uint16_t flag_delay=0;
uint16_t flag_mig=0;
uint16_t dwt=0;
uint16_t i=0;
uint16_t c=0;
uint16_t test=0;
uint16_t temp_delay_us=0;
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void SysTick_Handler(void) // 1 us
{
dwt=DWT_CYCCNT;
DWT_CYCCNT = 0;
// плата
delay_tick++;
if(delay_tick==500000)
{
delay_tick=0;
flag_tick=1;
//ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
flag_delay=1;
}
//-------------------------------------------------------------------------
int main()
{
RCC_ClocksTypeDef RCC_clock;
RCC_GetClocksFreq(&RCC_clock); // òàêòèðîâàíèÿ øèí
init();
//adc_init();
while(1)
{
//плата
if(flag_mig)
{
if(flag_tick)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
flag_tick=0;
flag_mig=0;
}
}
if(!flag_mig)
{
if(flag_tick)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
flag_tick=0;
flag_mig=1;
}
}
}
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void delay_us(uint32_t nTime)
{
while(nTime›=temp_delay_us)
{
if(flag_delay)
{
temp_delay_us++;
flag_delay=0;
}
}
temp_delay_us=0;
}
|
1-wire.h
PHP код:
|
#include "stm32_GPIO.h"
#define Time_Pulse_Delay_Low 10
#define Time_Pulse_Delay_High 60
#define Time_Reset_Low 480
#define Time_After_Reset 350
#define Time_Hold_Down 2
#define One_Wire_Read_ROM 0x33
#define One_Wire_Skip_ROM 0xCC
#define One_Wire_Search_ROM 0xF0
#define One_Wire_Match_ROM 0x55
#define One_Wire_Success 0x00
#define One_Wire_Error_No_Echo 0x01
#define One_Wire_Bus_Low_Error 0x02
#define One_Wire_Device_Busy 0x03
#define One_Wire_CRC_Error 0x04
unsigned int One_Wire_Reset(GPIO_TypeDef * GPIOx, u16 PINx);
void One_Wire_Write_Byte(unsigned char Byte,GPIO_TypeDef * GPIOx, u16 PINx);
unsigned char One_Wire_Read_Byte(GPIO_TypeDef * GPIOx, u16 PINx);
unsigned char One_Wire_Read_Bit (GPIO_TypeDef * GPIOx, u16 PINx);
void One_Wire_Write_Bit (unsigned char Bit,GPIO_TypeDef * GPIOx, u16 PINx);
|
1-wire.c отсюда вызываю delay_us(void)
PHP код:
|
#include "1-Wire.h"
#include "stm32_GPIO.h"
#include "main.h"
unsigned int One_Wire_Reset(GPIO_TypeDef * GPIOx, u16 PINx)
{
unsigned int tmp;
PIN_IN(GPIOx, PINx);
if ((PIN_SYG(GPIOx, PINx))==0) return One_Wire_Bus_Low_Error;
PIN_OUT_PP(GPIOx, PINx);
PIN_OFF(GPIOx, PINx);
delay_us(Time_Reset_Low);
PIN_ON(GPIOx, PINx);
PIN_IN(GPIOx, PINx);
delay_us(Time_Pulse_Delay_High);
if ((PIN_SYG(GPIOx, PINx))==0) tmp=One_Wire_Success;
else tmp=One_Wire_Error_No_Echo;
delay_us(Time_After_Reset);
return tmp;
}
void One_Wire_Write_Byte(unsigned char Byte,GPIO_TypeDef * GPIOx, u16 PINx)
{
unsigned char cnt;
for (cnt=0;cnt!=8;cnt++) One_Wire_Write_Bit(Byte&(1‹‹cnt),GPIOx, PINx);
}
void One_Wire_Write_Bit (unsigned char Bit,GPIO_TypeDef * GPIOx, u16 PINx)
{
PIN_OUT_PP(GPIOx, PINx);
PIN_OFF(GPIOx, PINx);
if (Bit==0)
{
delay_us(Time_Pulse_Delay_High);
PIN_ON(GPIOx, PINx);
delay_us(Time_Pulse_Delay_Low);
}
else
{
delay_us(Time_Pulse_Delay_Low);
PIN_ON(GPIOx, PINx);
delay_us(Time_Pulse_Delay_High);
}
PIN_IN(GPIOx, PINx);
}
unsigned char One_Wire_Read_Byte(GPIO_TypeDef * GPIOx, u16 PINx)
{
unsigned char tmp=0;
unsigned char cnt;
for (cnt=0;cnt!=8;cnt++)
if (One_Wire_Read_Bit(GPIOx, PINx)!=0) tmp|=(1‹‹cnt);
delay_us(Time_Pulse_Delay_High);
return tmp;
}
unsigned char One_Wire_Read_Bit (GPIO_TypeDef * GPIOx, u16 PINx)
{
unsigned char tmp;
PIN_OUT_PP(GPIOx, PINx);
PIN_OFF(GPIOx, PINx);
delay_us(Time_Hold_Down);
PIN_IN(GPIOx, PINx);
delay_us(Time_Pulse_Delay_Low);
if ((PIN_SYG(GPIOx, PINx))!=0) tmp = 1;
else tmp = 0;
delay_us(Time_Pulse_Delay_High);
return tmp;
}
|
ругается что некорректно вызов delay_us
PHP код:
|
UserSource\src\1-Wire.c(14): warning: #223-D: function "delay_us" declared implicitly
delay_us(Time_Reset_Low);
UserSource\src\1-Wire.c(36): warning: #223-D: function "delay_us" declared implicitly
delay_us(Time_Pulse_Delay_High);
UserSource\src\1-Wire.c(42): warning: #223-D: function "delay_us" declared implicitly
delay_us(Time_Pulse_Delay_Low);
UserSource\src\1-Wire.c(55): warning: #223-D: function "delay_us" declared implicitly
delay_us(Time_Pulse_Delay_High);
UserSource\src\1-Wire.c(64): warning: #223-D: function "delay_us" declared implicitly
delay_us(Time_Hold_Down);
UserSource\src\1-Wire.c: 5 warnings, 0 errors
|
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 24.03.2017 в 16:04.
|
|
|
|
24.03.2017, 16:06
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Какой знакомый код))) Не то, чтобы мне прямо на душе потеплело, но улыбка проползла.
Для задержек сделайте отдельный файл. Нечего им в main делать.
Идея такая - функции декларируются в отдельном хеадере, который потом прицепляете туда, где собираетесь их использовать.
|
|
|
|
24.03.2017, 16:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Сообщение от Easyrider83
|
Какой знакомый код))) Не то, чтобы мне прямо на душе потеплело, но улыбка проползла.
Для задержек сделайте отдельный файл. Нечего им в main делать.
Идея такая - функции декларируются в отдельном хеадере, который потом прицепляете туда, где собираетесь их использовать.
|
Да да ваш,но я использую таймер Systick из майн.с для задержки. Или пусть будут глобальные переменные и их будет видно и в отдельном файле задержки.
__________________
Глаза боятся,а руки делают.
|
|
|
|
24.03.2017, 16:13
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Сообщение от Easyrider83
|
...функции декларируются в отдельном хеадере, который потом прицепляете...
|
IMHO, ты забыл добавить, что с-файл с определением функции нужно подключить к проекту.
|
|
|
|
24.03.2017, 17:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
В main.h надо добавить объявление функции
void delay_us(uint32_t nTime);
Вам же компилятор об этом чёрным по белому говорит.
|
|
|
|
24.03.2017, 18:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Может так?
Ладно связи из майн подключаем другие файлы понимаю,но подключать майн в другой файл как то некорректно мне кажется. Или я запутался уже немного
__________________
Глаза боятся,а руки делают.
|
|
|
|
24.03.2017, 18:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Переменная вызова функции улучшает читабельность - её имя может быть любым допустимым.
Можно обойтись и без #include main.h в других файлах. Сделайте в них объявление см. ниже.
extern void delay_us(uint32_t nTime);
Последний раз редактировалось dgrishin; 24.03.2017 в 18:17.
|
|
|
|
24.03.2017, 18:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Ага спасибо,вспомнил про extern .
Шпаргалка же у меня есть.
__________________
Глаза боятся,а руки делают.
|
|
|
Сказали "Спасибо" CERGEI1982
|
|
|
25.03.2017, 12:09
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Сообщение от CERGEI1982
|
В майн определяю функцию delay_us(void),которая работает от прерываний таймера в майн файле и пытаюсь вызывать в подключенном файле.
|
Всем привет.
CERGEI, у меня, конечно, опыта мало и я любитель а не программист, но намой взгляд, у Вас в коде есть много лишнего, а кое-чего и не хватает. Сразу насчет лишнего. Не надо включать в каждый файл .с какие либо файлы кроме main.h. В соответствующие хидеры файлов .с не надо включать ничего, только макроопределения и прототипы тех функций, которые находятся в файле .с данного хидера, а в хидере main.h должны быть включены вначале все стандартные хидеры а потом все Ваши хидеры. Причем, если один хидер использует функции другого, то он должен быть расположен ниже другого. При такой структуре проекта я даже не использую #ifndef - #endif. Для добавления нового модуля достаточно включить в файл .с Вашего модуля main.h, а в main.h хидер Вашего модуля и все.
А теперь насчет вызова вашего delay. Ваша функция определена после главной программы, поэтому надо определить прототип в вашем хидере main.h, а так она у вас пытается вызваться предварительно необъявленной. Вернее объявлена неявно, о чем говорится в Вашем вонинге.
PS. И еще непонятка. В вопросе Вы пишете, что определяете функцию delay_us(void), но насамом деле она у Вас принимает параметр.
Кстати, обычно в больших проектах я не определяю ни каких функций в main.c а вместо main.c я делаю хидер mn.h и включаю его во все файлы .с в том числе и в main.c
Последний раз редактировалось МВА; 25.03.2017 в 13:41.
|
|
|
|
25.03.2017, 15:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Функция из main.c,вызов из подключенного файла
Сообщение от Easyrider83
|
Какой знакомый код))) Не то, чтобы мне прямо на душе потеплело, но улыбка проползла.
Для задержек сделайте отдельный файл. Нечего им в main делать.
Идея такая - функции декларируются в отдельном хеадере, который потом прицепляете туда, где собираетесь их использовать.
|
Интересно,а как вы задержку делали. Если делать через Systick в 1 us,то при частоте тактирования 72 Мгц (13 нС) почти живем в прерывании Systick. Сделал Systick 10 us.
Сообщение от МВА
|
Всем привет.
CERGEI, у меня, конечно, опыта мало и я любитель а не программист, но намой взгляд, у Вас в коде есть много лишнего, а кое-чего и не хватает. Сразу насчет лишнего. Не надо включать в каждый файл .с какие либо файлы кроме main.h.
|
Прочитайте шпаргалку которую выложил выше.Но каждый пишет так как ему удобно.
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 25.03.2017 в 15:40.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:02.
|
|