Мой диагноз - как допилят 6-ю версию пусть позовут. А я как-нибудь на вменяемых компиляторах останусь.
STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Понятно, спасибо.
Мой диагноз - как допилят 6-ю версию пусть позовут. А я как-нибудь на вменяемых компиляторах останусь.
Мой диагноз - как допилят 6-ю версию пусть позовут. А я как-нибудь на вменяемых компиляторах останусь.
- Реклама
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
А вменяемые -- это какие? На сайте арма есть GCC 7. К кейлу я не стал его прикручивать, а как автономный компайлер через make мои исходники собирает без проблем. Я, правда, без плюсов пишу.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
VladislavS, для начало хотя бы ANSI C изучил. Тебе уже обьяснил что в С++ явное инстанцирование шаблона делается после реализации.
Реализация шаблонов должна быть определена в заголовочном файле, чтобы компилятор смог выполнить инстанцирование шаблона для любых аргументов, но можно скрыть реализацию, используя явное инстанцирование. В заголовочном файле при этом остаётся только объявление шаблонов, а реализация помещается в отдельный файл. Для всех возможных вариантов применения шаблонов в этом модуле выполняется явное инстанцирование
Изучай С++ и не умничай на форумах. Ты слушай что тебе люди говорят и не брызгай своей желчью.
И завязывай уже KEIL убогим называть. В голове проблемы у тебя.
Если компилятор додумал твоих тараканов и проглотил это не значит что ты сделал по стандарту.
Это ты еще MISRA C не юзал, там для тебя вообще полнейший АД будет. Более 500 правил.
Реализация шаблонов должна быть определена в заголовочном файле, чтобы компилятор смог выполнить инстанцирование шаблона для любых аргументов, но можно скрыть реализацию, используя явное инстанцирование. В заголовочном файле при этом остаётся только объявление шаблонов, а реализация помещается в отдельный файл. Для всех возможных вариантов применения шаблонов в этом модуле выполняется явное инстанцирование
Изучай С++ и не умничай на форумах. Ты слушай что тебе люди говорят и не брызгай своей желчью.
И завязывай уже KEIL убогим называть. В голове проблемы у тебя.
Если компилятор додумал твоих тараканов и проглотил это не значит что ты сделал по стандарту.
Это ты еще MISRA C не юзал, там для тебя вообще полнейший АД будет. Более 500 правил.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Oxford , ты что, по всему интернету за мной гоняться будешь? Э как тебя штырит то 
- Реклама
- Сообщения: 56
- Зарегистрирован: Вт дек 29, 2015 11:33:49
Совершенно неожиданно столкнулся с проблемой, по всей видимости, настроек кейла. Перестал работать дебагинг. Создал новый проект, запускаю дебаг и... ничего. Указатель стоит на функции main() и дальше двигаться не желает:
Делаю сброс, после чего начинается начальная инициализация, которая останавливается на импорте SystemInit и далее так же не движется:
Уже глаз дергается, но понимания где косячу так и нет 
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
А проект собирается с отладочной информацией? Гляньте таб debug в опциях проекта.
- Сообщения: 56
- Зарегистрирован: Вт дек 29, 2015 11:33:49
Там я все на 10 раз перепроверил уже, в приложении скрин на всякий. Я вот еще что заметил, проблема не только в дебаге - проект собирается, благополучно отправляется в МК, но при этом загруженный в него код не исполняется. В режиме дебага руками потыкал регистры - реагирует адекватно, что случилось?
- Вложения
-
- 2018-08-02_23-55-19.png
- (33.04 КБ) 260 скачиваний
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Здравствуйте.
Настраиваю I2C с помощью HAL.
В main.c в глобальных переменных появляется для заполнения структуры.
Теперь мне нужно использовать hi2c1 в функциях для работы с периферией
Эти функции мне нужны в других .c файлах.
Сами функции видны, а вот на первый аргумент компилятор ругается
Я пиcала и в хедере и в .c файле, и без extern пробовала, но компилятор ругается
В принципе неважно, HAL это или какая либо друга библиотека. Непонятно как "портировать" переменные структуры между модулями.
Настраиваю I2C с помощью HAL.
В main.c в глобальных переменных появляется
Код: Выделить всё
I2C_HandleTypeDef hi2c1;Теперь мне нужно использовать hi2c1 в функциях для работы с периферией
Код: Выделить всё
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_I2C_Mem_Write(hi2c1, (uint16_t) (slave_adr<<1), (uint16_t) adxl_reg, I2C_MEMADD_SIZE_8BIT, adxl_data, datasize, (uint32_t)1000) {}//
Сами функции видны, а вот на первый аргумент компилятор ругается
Я пиcала и в хедере и в .c файле, и без extern пробовала, но компилятор ругается
Код: Выделить всё
extern I2C_HandleTypeDef hi2c1; Как быть?error: #20: identifier "I2C_HandleTypeDef" is undefined
I2C_HandleTypeDef hi2c1;
В принципе неважно, HAL это или какая либо друга библиотека. Непонятно как "портировать" переменные структуры между модулями.
Я конечно все понимаю, но этого я не понимаю.
у вас компилятор не видит типа I2C_HandleTypeDef, а не структуры hi2c1. вам надо там, где эта структура упоминается/используется (или указатель на неё) подключить соответствующий хедер из HAL, где выполнено описание этого типа
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Проблема "решилась" помещением функция R/W в main.c
Теперь они выглядят так:
А в других фалах эти функции прописываются с extern в хэдере.
Все работает, но мне бы все равно хотелось узнать есть ли альтернативное решение это проблемы со структурами.
Добавлено after 4 minutes 50 seconds:
Описание этого типа находится в "stm32f2xx_hal_i2c.h", который у меня подключен, иначе бы функции HAL_I2C_Mem_Read, HAL_I2C_Mem_Write не были бы видны, они описаны там же.
Теперь они выглядят так:
Код: Выделить всё
void I2C1_WriteData(uint8_t slave_adr, uint8_t reg, uint8_t*data, uint16_t datasize){
uint8_t error_str[]={"I2C Error"};
while(HAL_I2C_Mem_Write(&hi2c1, (uint16_t) (slave_adr<<1), (uint16_t) reg, I2C_MEMADD_SIZE_8BIT, data, datasize, (uint32_t)1000)!= HAL_OK){
if (HAL_I2C_GetError(&hi2c1) == HAL_I2C_ERROR_AF){
LCD_Clear(white);
LCD_PutStr(0,0,error_str,red,white);
}}}
//---------------------------------------------------------------------------------------//
void I2C1_ReadData(uint8_t slave_adr, uint8_t reg, uint8_t*data, uint16_t datasize){
uint8_t error_str[]={"I2C Error"};
while(HAL_I2C_Mem_Read(&hi2c1, (uint16_t) (slave_adr<<1), (uint16_t) reg, I2C_MEMADD_SIZE_8BIT, data, datasize, (uint32_t)1000)!= HAL_OK){
if (HAL_I2C_GetError(&hi2c1) == HAL_I2C_ERROR_AF){
LCD_Clear(white);
LCD_PutStr(0,0,error_str,red,white);
}}}
Все работает, но мне бы все равно хотелось узнать есть ли альтернативное решение это проблемы со структурами.
Добавлено after 4 minutes 50 seconds:
Описание этого типа находится в "stm32f2xx_hal_i2c.h", который у меня подключен, иначе бы функции HAL_I2C_Mem_Read, HAL_I2C_Mem_Write не были бы видны, они описаны там же.
Я конечно все понимаю, но этого я не понимаю.
если он ругается на это, то именно в этом месте где-то выше по тексту и должен быть проинклюден stm32f2xx_hal_i2c.h - это так?bezzabotna писал(а):Я пиcала и в хедере и в .c файле, и без extern пробовала, но компилятор ругается
Код:
extern I2C_HandleTypeDef hi2c1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Да.
Пробовала подключать и напрямую
#include "stm32f2xx_hal_i2c.h"
и через
#include "stm32f2xx_hal.h"
Ошибки выдает.
Пробовала подключать и напрямую
#include "stm32f2xx_hal_i2c.h"
и через
#include "stm32f2xx_hal.h"
Ошибки выдает.
Я конечно все понимаю, но этого я не понимаю.
покажите весь проект, чего там куда понаписали.
навскидку так - хидер, в котором вы объявляете переменную, точно цепляется после HAL-овских?
навскидку так - хидер, в котором вы объявляете переменную, точно цепляется после HAL-овских?
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Действительно в main.c было
#include "main.h"
#include "stm32f2xx_hal.h", а не наоборот.
Но на количество ошибок это не повлияло. В остальных файлах вроде в правильном порядке.
#include "main.h"
#include "stm32f2xx_hal.h", а не наоборот.
Но на количество ошибок это не повлияло. В остальных файлах вроде в правильном порядке.
- Вложения
-
- adxl345.c
- (1.96 КБ) 551 скачивание
-
- main.c
- (11.91 КБ) 350 скачиваний
-
- main.h
- (3.48 КБ) 541 скачивание
-
- adxl345.h
- (873 байт) 515 скачиваний
Я конечно все понимаю, но этого я не понимаю.
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
в main.h подцепите stm32f2xx_hal.h , иначе на момент объявления там переменной этот тип еще не описан
или нет. Чот запутался.
что происходит: при попытке компиляции файла adxl345.c с раскомментированными в adxl345.h строчками с extern I2C_HandleTypeDef hi2c1, ADXL_WriteData и ADXL_ReadData оно не может найти тип I2C_HandleTypeDef?
в stm32f2xx_hal_conf.h раскомментировано #define HAL_I2C_MODULE_ENABLED?
или нет. Чот запутался.
что происходит: при попытке компиляции файла adxl345.c с раскомментированными в adxl345.h строчками с extern I2C_HandleTypeDef hi2c1, ADXL_WriteData и ADXL_ReadData оно не может найти тип I2C_HandleTypeDef?
в stm32f2xx_hal_conf.h раскомментировано #define HAL_I2C_MODULE_ENABLED?


