初级会员
- 积分
- 178
- 金钱
- 178
- 注册时间
- 2013-11-19
- 在线时间
- 22 小时
|
5金钱
各位大侠,首先,我想问一个关于编译的问题。。。
NO1: 我在APP.C里面#define GLOBALS ,然后当进入demo.h编译的时候,遇到EXT是不是就自动转换为空格了,也就是说,不是外部的了?
而对于其他.c文件,比如说bsp.C, 当遇到ext以后,该怎么处理? 是要把ext变味extern吗?)
为什么要声明称EXTERN类型的呢? (如果不这么声明,好像会报错,重复定义)。。这点,很不解。。。
NO2,我想做DAM实验,在程序了定义一个DMA_SendBuff[10]={0x00,0x01,0x02……一直到0x09},但是当在demo.h中声明的时候,总是报错。。。我该怎么声明?
求高手指点???
部分代码:bsp.c
#include <includes.h>
//#include "stm32f10x.h"
INT16U DMA1_MEM_LEN; //保存DMA每次数据传送的长度
DMA_InitTypeDef DMA_InitStructure;
void BSP_Init(void)
{
RCC_Configuration();
GPIO_Configuration();
USART_Config(USART1,9600 ) ;
My_DMA_Config();
NVIC_Configuration();
//EXTI_Configuration();
}
void RCC_Configuration(void)
{
SystemInit();
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
void My_DMA_Config(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
DMA_DeInit(DMA1_Channel4); //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR); //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&DMA_SendBuff; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = 10; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC, ENABLE);
DMA_Cmd(DMA1_Channel4, ENABLE); // Enable DMA Channel1
}
void NVIC_Configuration(void) //中断源配置
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); /* Set the Vector Table base location at 0x20000000 */
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); /* Set the Vector Table base location at 0x08000000 */
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//先占优先级4位,从优先级0位 ;有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断
//配置外部中断线 13,发送信号量(but 貌似有问题,不知道怎么回事,按键一下,灯亮很多次?抖动?)
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //设置外部中断线EXTI15_10 优先级为4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//配置串口中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
}
报错:.\Output\DA_Transfer.axf: Error: L6200E: Symbol DMA_SendBuff multiply defined (by stm32f10x_it.o and app.o).
app.c中#define GLOBALS
#include <includes.h>
static OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];
static OS_STK led0_task_stk[LED0_TASK_STK_SIZE];
static OS_STK led1_task_stk[LED1_TASK_STK_SIZE];
static OS_STK usart_task_stk[USART_TASK_STK_SIZE];
static void startup_task(void *p_arg);
static void led0_task(void* p_arg);
static void led1_task(void* p_arg);
static void usart_task(void* p_arg);
static void systick_init(void);// 函数声明
static void systick_init(void)
{
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
SysTick_Config(rcc_clocks.HCLK_Frequency/OS_TICKS_PER_SEC);
}
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (u8) ch;
return ch;
}
#endif
int main(void)
{
BSP_Init();
OSInit();
OSTaskCreate( startup_task,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1],STARTUP_TASK_PRIO);
OSTimeSet(0);
OSStart();
return 0;
}
static void startup_task(void *p_arg)
{
p_arg=p_arg;
systick_init();
#if (OS_TASK_STAT_EN>0)
OSStatInit(); /* Determine CPU capacity. */
#endif
SEM=OSSemCreate(0);
OSTaskCreate(led0_task,(void *)0,&led0_task_stk[LED0_TASK_STK_SIZE-1],LED0_TASK_PRIO);
OSTaskCreate(led1_task,(void *)0,&led1_task_stk[LED1_TASK_STK_SIZE-1],LED1_TASK_PRIO);
OSTaskCreate(usart_task,(void *)0,&usart_task_stk[USART_TASK_STK_SIZE-1],USART_TASK_PRIO);
OSTaskDel(OS_PRIO_SELF);
}
void usart_task(void* p_arg)
{
INT16U time;
p_arg=p_arg;
while(1)
{
time++;
if(time>20)
{
time=0;
printf("\n您发送的消息为:\n");
}
OSTimeDlyHMSM(0, 0, 0, 50);
}
}
static void led0_task(void* p_arg)
{
INT8U err,i;
p_arg=p_arg;
while (1)
{
OSSemPend(SEM,0,&err);
for(i=0;i<3;i++)
{
LED0_ON();
OSTimeDlyHMSM(0, 0, 0, 100);
LED0_OFF();
OSTimeDlyHMSM(0,0,0,200);
}
}
}
static void led1_task(void* p_arg)
{
p_arg=p_arg;
while (1)
{
LED1_ON();
OSTimeDlyHMSM(0, 0, 0, 500);
LED1_OFF();
OSTimeDlyHMSM(0,0,0,500);
}
}
可能描述的比清楚,希望高手能留个QQ 我的 409801643 |
最佳答案
查看完整内容[请看2#楼]
1,ext是ucosii自己定义的一个东西,其实就是extern.ucosii下面,ext==extern.extern就是声明改变量/函数,在本文件之外的其他文件被定义了.所以在本文件也可以正常使用.但是前提一定是:别的文件必须有定义.
2,在头文件里面不宜定义数组/函数实体,这样多个.c文件包含这个.h文件的时候,就会出现重复定义.你可以在.c文件定义,然后在.h文件用extern声明,这就很好的解决这个问题了.
3,你这个报错,就是2个.c文件重复定义了同一个函数.导致报 ...
|