Здравствуйте, возникли вопросы по работе с вашим процессором и библиотеке.
1. Мне необходимо реализовать проект в котором:
6 каналов UART ведут прием пакетов (16 байтных) на скорости 115200 и (возможно по DMA) раскладывают принятые пакеты по
буферам. Каналы равноприоритетные. Я пока не определился хватит ли производительности с прерываниями по заполнению
FIFO или надо, все таки, использовать прерывания от DMA
1 прерывание от ноги GPIO
1 МПКД в режиме ОУ
Хотелось бы "рыбу" проекта (желательно под gcc eclipse).
2. Некоторые замечания по биоблиотеке
и для IAR и для GCC в библиотеке есть несколько ошибок:
файл i2c.c
Код:
CTRL_T I2C_GetCtrlNum(I2C_T *pI2C)
{
CTRL_T CtrlI2C = I2C_CTRL_NUM;
return CtrlI2C;
}
неиспользуемый параметр pI2C и переменная CtrlI2C : функция в любом случае возвращает I2C_CTRL_NUM
файл mkpd.c
Код:
void MKPD_Set_System_Clock(MKPD_T *pMKPD, uint32_t sys_clk)
{
pMKPD->SETTING0 = (pMKPD->SETTING0 & ~(0xFF << 24)) | MKPD_SETTING0_SYS_CLK(sys_clk-1);
}
из-за того, что в define макроса MKPD_SETTING0_SYS_CLK параметр x не экранирован скобками, то результат будет неправильным
Код:
#define MKPD_SETTING0_SYS_CLK(x) ((uint32_t)((x & 0xFF) << 24)) /**< системная частота в МГц */
а должно быть
Код:
#define MKPD_SETTING0_SYS_CLK(x) ((uint32_t)(((x) & 0xFF) << 24)) /**< системная частота в МГц */
вообще такая ошибка (с не экранированием скобками параметра макроса) присутствует в многих макросах
файл fpu.c
в нем часто встречается конструкция
Код:
if (-1<A<1)
может IAR это и одобряет, но видимо должно быть
Код:
if ((A > -1) && (A < 1))
Код:
float FPU_tg(float A)
{
if (-1<A<1)
{
float T = FPU_pow3(A); ///< A^3
float X = FPU_ADD(A,3); ///< A + A^3/3
float Y = FPU_MUL(FPU_MUL(FPU_pow3(A),A),A); ///< A^5
float res = FPU_ADD(X,2*Y/15); ///< A + A^3/3 + 2*A^5/15
return res;
если верить коментариям, то правильно
Код:
float FPU_tg(float A)
{
if ((A > -1) && (A < 1))
{
float T = FPU_pow3(A); ///< A^3
float X = FPU_ADD(A,(float)T/3); ///< A + A^3/3
float Y = FPU_MUL(FPU_MUL(T,A),A); ///< A^5
float res = FPU_ADD(X,2*Y/15); ///< A + A^3/3 + 2*A^5/15
return res;
аналогично в других функциях
Код:
float FPU_atg(float A)
{
if (-1<A<1)
{
float T = FPU_pow3(A); ///< A^3
float X = FPU_SUB(A,3); ///< A - A^3/3
float Y = FPU_MUL(FPU_MUL(FPU_pow3(A),A),A); ///< A^5
float res = FPU_ADD(X,2*Y/15); ///< A - A^3/3 + 2*A^5/15
return res;
float FPU_atg(float A)
{
if ((A > -1) && (A < 1))
{
float T = FPU_pow3(A); ///< A^3
float X = FPU_SUB(A,(float)T/3); ///< A - A^3/3
float Y = FPU_MUL(FPU_MUL(T,A),A); ///< A^5
float res = FPU_ADD(X,2*Y/15); ///< A - A^3/3 + 2*A^5/15
return res;
В таблице векторов gcc прописаны не все вектора
и вообще файл vector_DEVICE.c для gcc лучше оформить в виде
Код:
// ----------------------------------------------------------------------------
#include "cortexm/ExceptionHandlers.h"
// ----------------------------------------------------------------------------
void Default_Handler(void);
// Forward declaration of the specific IRQ handlers. These are aliased
// to the Default_Handler, which is a 'forever' loop. When the application
// defines a handler (with the same name), this will automatically take
// precedence over these weak definitions
//
void Timer_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Watchdog_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_3_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_4_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void SPI_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void SPI_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_A_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_B_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_C_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_D_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_E_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_F_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_G_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_H_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Spacewire1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Spacewire2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void CAN1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void CAN2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester3_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester4_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_SPI_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_SPI_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_3_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_4_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
// ----------------------------------------------------------------------------
extern unsigned int _estack;
typedef void
(* const pHandler)(void);
// ----------------------------------------------------------------------------
// The vector table.
// This relies on the linker script to place at correct location in memory.
__attribute__ ((section(".isr_vector"),used))
pHandler __isr_vectors[] =
{ //
(pHandler) &_estack, // The initial stack pointer
Reset_Handler, // The reset handler
NMI_Handler, // The NMI handler
HardFault_Handler, // The hard fault handler
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
MemManage_Handler, // The MPU fault handler
BusFault_Handler,// The bus fault handler
UsageFault_Handler,// The usage fault handler
#else
0, 0, 0, // Reserved
#endif
0, // Reserved
0, // Reserved
0, // Reserved
0, // Reserved
SVC_Handler, // SVCall handler
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
DebugMon_Handler, // Debug monitor handler
#else
0, // Reserved
#endif
0, // Reserved
PendSV_Handler, // The PendSV handler
SysTick_Handler, // The SysTick handler
// ----------------------------------------------------------------------
// DEVICE vectors
Timer_IRQ, // Device specific
Watchdog_IRQ,
UART_1_IRQ,
UART_2_IRQ,
UART_3_IRQ,
UART_4_IRQ,
SPI_1_IRQ,
SPI_2_IRQ,
GPIO_A_IRQ,
GPIO_B_IRQ,
GPIO_C_IRQ,
GPIO_D_IRQ,
GPIO_E_IRQ,
GPIO_F_IRQ,
GPIO_G_IRQ,
GPIO_H_IRQ,
Spacewire1_IRQ,
Spacewire2_IRQ,
CAN1_IRQ,
CAN2_IRQ,
Manchester1_IRQ,
Manchester2_IRQ,
Manchester3_IRQ,
Manchester4_IRQ,
0,
0,
DMA_DONE_SPI_1_IRQ,
DMA_DONE_SPI_2_IRQ,
DMA_DONE_UART_1_IRQ,
DMA_DONE_UART_2_IRQ,
DMA_DONE_UART_3_IRQ,
DMA_DONE_UART_4_IRQ,
};
// ----------------------------------------------------------------------------
// Processor ends up here if an unexpected interrupt occurs or a specific
// handler is not present in the application code.
void __attribute__ ((section(".after_vectors")))
Default_Handler(void)
{
while (1)
{
}
}
// ----------------------------------------------------------------------------
хотя я и не понимаю где должны быть обработчики UART5, UART6 и соответствующие DMA