Про Keil uVision 5

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Почему не так?
*(uint16_t ) (LCD_REG) = reg;
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Про Keil uVision 5

Сообщение menzoda »

Потому что тогда (uint16_t)(LCD_REG) превратит значение адреса в двухбайтное целое число. Во-первых, адрес может быть числом как меньше 2 байт, так и больше, и в последнем случае мы его обрежем приведя к двухбайтному целому типу. Во-вторых, в Си нельзя разадресовать просто число, только какой-нибудь указатель. Такой вот уж стандарт языка, нету там простой конструкции "записать по адресу N", приходится по несколько раз приводить типы один к другому.
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Про Keil uVision 5

Сообщение Myp3ik »

baghear, может так :

*(__IO uint16_t *) (LCD_REG) = reg;

__IO он же volatile.
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Про Keil uVision 5

Сообщение menzoda »

Ну все, совсем человека запутали. Он и так с указателями на вы, а тут еще какой-то __IO и volatile.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Спасибо, приму как должное
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Что такое volatile в курсе, а вот что такое __IO?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Про Keil uVision 5

Сообщение menzoda »

Какое-нибудь макроопределение или typedef. Обычно производители вот так делают:

Код: Выделить всё

typedef volatile uint8_t*  __IO8;
typedef volatile uint16_t* __IO16;
typedef volatile uint32_t* __IO32;


Тогда объявления регистров будут такими:

Код: Выделить всё

#define REG_CON (*_IO16 (0xFFFFBBB0))
#define REG_STS (*_IO32 (0xFFFFBBB2))
#define REG_DBG (*_IO16 (0xFFFFBBB6))


Пользоваться как обычными переменными:

Код: Выделить всё

...
if (REG_STS == 0x25)
{
    REG_CON |= 0xFA1;
}
...
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Спасибо!!!
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Добрый день, что означает такая запись ?
#define assert_param(expr) ((void)0)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Про Keil uVision 5

Сообщение menzoda »

На самом деле ничего. Любой assert_param в коде независимо от его параметра заменяется на конструкцию ((void)0), которая ничего не делает и игнорируется компилятором. Вообще, assert - это такая штука, которая валит программу с сообщением об ошибке, если переданный ей параметр равен нулю, или false. При отладке это может помочь найти всякие ошибки, вроде неправильного использования функции. Например:

Код: Выделить всё

void Foo(int a)
{
    // Программа аварийно завершиться, если мы передадим функции
    // значение меньше ста или больше тысячи.
    assert(a < 100);
    assert(a > 1000);

    ...
}


Когда программа отлажена и готова для выпуска, то все ассерты хорошо бы удалить, чтобы они не потребляли зря ресурсов. Шерстить все функции на их наличие не удобно, да и не всегда возможно, поэтому в файле, где объявлен assert (какой-нибудь assert.h), вводят конструкцию наподобие указанной тобой, чтобы все вызовы assert заменились препроцессором на нечто незначащее и были выкинуты компилятором. Вот так.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Спасибо, а (void) 0 - приведение нуля к типу?
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Re: Про Keil uVision 5

Сообщение menzoda »

Да, если просто написать ноль, то компилятор возможно выдаст предупреждение о неиспользуемом значении, приведя его к void можно избежать этого. Лично я бы не стал использовать такую, несколько непривычную конструкцию для того, чтобы игнорировать вызов assert. По мне намного логичней выглядит такая запись:

Код: Выделить всё

#define assert(expr)

то есть, "пустое" макроопределение. В этом случае препроцессор не будет заменять его на незначащую конструкцию, а просто выкинет и все. Хотя, это дело вкуса.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Большое спасибо
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Re: Про Keil uVision 5

Сообщение eess9 »

Народ,подскажите пожалуйста.
Разбираюсь с lwIP стеком. Скачал пример с сайта st. В дереве проекта напротив двух файлов 3 вертикальных красных квадратика. Что это такое? Не разу не сталкивался. Это влияет на процесс компиляции?
Вложения
keil.jpg
(140.69 КБ) 520 скачиваний
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Про Keil uVision 5

Сообщение dosikus »

Это значит что настройки компиляции для этих файлов изменены и при компиляции будут задействованы именно они а не общие для проекта.
Клик правой кнопкой по этим файлам в менеджере проекта -> Options for file 'xxx' и смотри изменения ...
GHOST_J_D
Родился
Сообщения: 12
Зарегистрирован: Пт дек 14, 2012 21:07:49
Откуда: Екатеринбург
Контактная информация:

Re: Про Keil uVision 5

Сообщение GHOST_J_D »

Разбираюся с примером 3 отсюда http://radiokot.ru/articles/43/ плата влдешная, кейл5 выдает такую ошибку source\STM32_init\STM32_Init.c(31): error: #5: cannot open source input file "stm32f10x_lib.h": No such file or directory
#include "stm32f10x_lib.h" // STM32F10x Library Definitions
Скачивал новые библиотеки https://translate.googleusercontent.com ... pNpmO5EEiQ заменял файлы из примера на них, всеравно выдает тоже самое, в 3, 4, и 5 примерах.
Куда копать :( подскажите пожалуйста.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Про Keil uVision 5

Сообщение oleg110592 »

пробуйте #include "stm32f10x.h"
#include "stm32f10x_lib.h" похоже было в старых библиотеках (V2.x).
Лучше разбирать примеры от производителя (имхо).
GHOST_J_D
Родился
Сообщения: 12
Зарегистрирован: Пт дек 14, 2012 21:07:49
Откуда: Екатеринбург
Контактная информация:

Re: Про Keil uVision 5

Сообщение GHOST_J_D »

Переподключил в файле INIT.c
Начал компилить исходник.Но выдает 39 варнингов source\STM32_init\STM32_Reg.h(38): warning: #47-D: incompatible redefinition of macro "PWR_CR_DBP" (declared at line 1517 of ".\source\config\stm32f10x.h") такого плана. :( Может ктонибуть тыкнуть в рвбочие примеры. Заводские примеры stm32vldiscovery_package уже скачал.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Про Keil uVision 5

Сообщение oleg110592 »

В библиотеке STM32F10x standard peripheral library полно примеров, практически для всех "внутренностей" микроконтроллеров этой линейки:
STM32F10x StdPeriph_Lib Examples
The package contains the following examples:
ADC - BKP - CAN - CEC - CortexM3 - CRC - DAC - DMA - EXTI - FLASH - FSMC - GPIO - I2C - I2S - IWDG - Lib_DEBUG - NVIC - PWR - RCC - RTC - SDIO - SPI - SysTick - TIM - USART - WWDG
Так же есть готовые шаблоны для проектов IAR, Keil, Atolic TrueSTUDIO
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Про Keil uVision 5

Сообщение baghear »

Добрый день, подскажите почему программа не заходит в прерывание?
Спойлер#include "stm32f10x.h" // Device header
#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC

int main(void)
{
RCC_HSICmd(ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);

TIM4->PSC = 8000;
TIM4->ARR = 1000;
TIM4->DIER |= TIM_DIER_UIE;

NVIC_EnableIRQ (TIM4_IRQn);

TIM4->CR1 |= TIM_CR1_CEN;
__enable_irq ();

while(1)
{

}
}

void TIM4_IRQnHandler(void)
{
TIM4->SR &= ~TIM_SR_UIF;
}

Есть ли в keil флаг глобального разрешения прерываний, где его посмотреть?
Хотелось бы понять выполняется ли команда __enable_irq ();
Последний раз редактировалось baghear Чт окт 30, 2014 20:57:27, всего редактировалось 2 раза.
Ответить

Вернуться в «ARM»